C#で記述したWebサービスをDelphi上で呼び出した場合の問題について
まず最初に、.net プラットフォームでの Web サービスの開発について比較的包括的に説明する必要があると思います。Web サービスの初期世代は、従来の手段では解決できなくなっています。アプリケーションなどでは、dcom や corba などのバイナリ メカニズムを使用できなくなりました。たとえば、dcom (共通オブジェクト モデルの配布) などです。は Windows プラットフォームでのみ実行できますが、corba (共通オブジェクト要求ブローカー)アーキテクチャ) は Java プラットフォームの製品にすぎません。アプリケーション間のデータ通信を実現するのは困難です。
このような状況において、Web サービスは時代の要求に応じて登場し、クロス言語、クロスプラットフォーム、および企業ファイアウォールの適切かつ安全な侵入を可能にする優れたソリューションです。そのアーキテクチャは通常、次の 5 つのレベルに分かれています。
http (ハイパーテキスト転送プロトコル) チャネルでのデータ通信
XML(拡張マークアップ言語)データ表現形式
SOAP のデータのカプセル化 (シンプル オブジェクト アクセス プロトコル)
wsdl(Webサービス記述言語)の記述言語形式
uddi (Universal description and Discovery Integration) 統合された記述、検出、および統合
クロス言語、クロスプラットフォームであり、企業のファイアウォールを安全に通過できるというだけでも、私たちは興奮するのに十分です。ただし、次のような改善が必要な領域もあります。
HTTP データ通信、特に最初の接続が遅い。
Web サーバーの追加のオーバーヘッドが必要
Web サービスのアーキテクチャとその利点と欠点について説明した後、今回の議論のテーマである本題に入りましょう。
Delphi で Web サービス サービスを呼び出すときの問題
これは、顧客 a から顧客 b への転送を完了する単純なビジネス プロセスです。
まず、.net Framework1.1 で Web サービスを作成します。この時点では、.net が自動的に Web アプリケーションを作成します。
名前空間attributetestingの下にクラスattributetestを作成する必要があります。その後、このクラスはその基本クラスsystem.web.services.webserviceを自動的に継承します。必要に応じて、Webアプリケーション・クラスのwebserviceattributeを設定できます。基本属性には説明が含まれます。と名前空間
[webserviceattribute(namespace=http://www.isdoo.com/services,
description=こんにちはアンセル、これはテスト中の Web サービスです!)]
パブリッククラス属性テスト:system.web.services.webservice
{
[webmethodattribute(description=説明情報: count メソッドを継承し、名前をオーバーロードします。実行は、ユーザー a からユーザー b への送金です...,
//messagename=メッセージ名の変更、
バッファ応答=true、
キャッシュ期間=1000、
イネーブルセッション = true、
トランザクションオプション=トランザクションオプション.requiresnew)]
パブリック文字列transmoney(ダブルマネー)
{
試す
{
contextutil.enablecommit();//トランザクションはデータベース操作のみに使用されます。
マネーイントア(お金);
お金からb(お金);
contextutil.setcomplete();
トランザクションが正常に返されました。合計 +money.tostring();
}
catch(例外e)
{
contextutil.setabort();
/n/r +e.message; トランザクションを返します。
}
}
プライベートボイドマネーイントーア(ダブルマネー)
{
sqlcommand sqlcom = new sqlcommand(更新予算セットmoney=money++money.tostring()+ where name='a');
データベースアクセス mydatabase = 新しいデータベースアクセス();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
// 新しい例外をスローします (a に送金するときに操作が失敗しました!);
}
プライベートボイドマネーアウトフロム(ダブルマネー)
{
sqlcommand sqlcom = new sqlcommand(予算を更新 set Money=money-+money.tostring()+ where name='b');
データベースアクセス mydatabase = 新しいデータベースアクセス();
sqlcom.connection=mydatabase.getconnection();
sqlcom.connection.open();
sqlcom.executenonquery();
sqlcom.connection.close();
//新しい例外をスローします(b から送金するときに操作が失敗しました!);
}
}
特に注意する必要があるのは webmethodattribute です。これは、今回説明する必要がある内容の焦点でもあります。[webmethodattribute] をメソッドに追加すると、メソッドに属性が含まれていない場合でも、Web サービスが作成されます。は、このメソッドをクライアント セグメントの呼び出し元に公開します。2 つの説明情報属性と 4 つの機能属性を含む 6 つの属性について説明します。
説明情報の属性:
説明
メッセージ名
4つの機能特性:
バッファ応答
キャッシュ期間
セッションを有効にする
トランザクションオプション
このうち、messagename 属性に注意する必要があります。Delphi が .net プラットフォームで開発された Web サービスを呼び出す場合、messagename 属性を設定すると、クライアントが呼び出すときにエラーが報告されます。これはバグである可能性があります。おそらく、新しいバージョンではこの問題が解決されるでしょう。これらの属性の具体的な機能については、ここでは詳しく説明しません。関連書籍を読むことができます。
以下に、Delphi が Web サービスを呼び出す手順を示します。
まず、クライアントを開発して呼び出すだけの場合は、通常のアプリケーションを作成するだけで済みます。その後、ツールバーの Web サービスの下にある soaphttpclient コントロールを見つけて、それをクライアント アプリケーションのウィンドウ本体に配置するだけです。 ;
次に、このsoaphttpclientの属性urlまたはwsdlを設定する必要があります。このコンテンツはWebサービスのサービスアドレスです。
たとえば、現在の例のサービス アドレスは次のとおりです: http://localhost/attributetesting/attributetesting.asmx
wsdl を入力する場合は、http://localhost/attributetesting/attributetesting.asmx?wsdl となります。
これで制御設定は完了です。
次に、サーバー側の wsdl をインポートする必要があります。これは手動で行うことも、Delphi が提供する Web サービス インポーター機能を使用することもできます。
最後に、インポートされた wsdl インターフェイスを呼び出すだけで済みます。ここでの対応するコードは次のとおりです。
プロシージャ tform1.bitbtn1click(sender: tobject);
変数
aa:attributetestsoap;//これは、wsdl のクラス インターフェイス オブジェクトです
メッセージ:ワイド文字列;
bb:ダブル;
始める
//httprio2 は実際にはいわゆるプロキシ クラスであり、データ送信、リクエストの送信、応答の受け取りを担当します。
aa:=httprio2 属性 testsoap;
bb:=100.00;
msg:=aa.transmoney(bb);//これは、Web サービスを呼び出すことによって公開される Web サービス メソッド webmethod です。
showmessage(msg);
終わり;
はい、それだけです!
商用ソース コードの一般的なダウンロード www.html.org.cn