XML Web サービスとの非同期通信

このトピックの対象は、レガシ テクノロジに特定されています。XML Web サービスと XML Web サービス クライアントは以下を使用して作成してください。 Windows Communication Foundation.

Web サービスとの非同期通信は、.NET Framework で仕様が規定されている、2 つの非同期メソッド呼び出しのデザイン パターンに従います。ただし、これらの詳細を確認する前に、Web サービスは、非同期要求を処理するよう特に記述されていなくても非同期に呼び出すことができることに注意してください。

Wsdl.exe と .NET Framework の非同期デザイン パターン

Web サービス記述言語ツール (Wsdl.exe) で、特定の Web サービスにアクセスするためのクライアント プロキシ クラスを生成すると、各 Web サービス メソッドと非同期に通信するための 2 つの機構を備えたプロキシ クラスが提供されます。1 つ目の機構は Begin/End パターンです。2 つ目の機構は、.NET Framework Version 2 で使用可能な、イベント ドリブンの非同期プログラミング パターンです。Web サービスでのこれらのパターンの使用に関する簡単な説明については、次の各セクションを参照してください。両方のパターンの詳細については、「Asynchronous Programming Design Patterns」を参照してください。

Begin/End 呼び出しパターン

Wsdl.exe は、Web サービスで公開される各操作 (ASP.NET 内の Web サービス メソッド) について 3 つのメソッドを自動的に作成します。1 つは同期アクセス用のメソッドであり、他の 2 つは非同期アクセス用のメソッドです。これは、Web サービス メソッドが同期実装しかない場合でも同様です。これらの 3 つのメソッドについて次の表で説明します。

プロキシ クラスでのメソッド名 説明

<NameOfWebServiceMethod>

<NameOfWebServiceMethod> という名前の Web サービス メソッドにメッセージを同期的に送信します。

Begin<NameOfWebServiceMethod>

<NameOfWebServiceMethod> という名前の Web サービス メソッドとの非同期メッセージ通信を開始します。クライアントは Begin メソッドに対して、サービス呼び出しの処理を開始し、すぐに制御を返すように指示します。戻り値は、Web サービス メソッドで指定されたデータ型ではなく、IAsyncResult インターフェイスを実装している型です。

End<NameOfWebServiceMethod>

<NameOfWebServiceMethod> という名前の Web サービス メソッドとの非同期メッセージ通信を終了し、Web サービス メソッド呼び出しの結果の値を返します。

Begin メソッドと End メソッドは、.NET Framework の非同期デザイン パターンの名前付け規則に従っています。デザイン パターンは、この規則に基づいて名前が付けられた 2 つの非同期メソッドが、各同期メソッドに存在することを前提としています。

たとえば、PrimeFactorizer という Web サービス クラスについて考えてみましょう。このクラスには、素因数を検索する次のようなシグネチャの Web サービス メソッドがあるとします。

public long[] Factorize(long factorizableNum)

このようなメソッドは、入力によっては、処理が完了するまでに比較的長い時間がかかることがあります。したがって、これは、Web サービス クライアントに Web サービス メソッドを非同期で呼び出させることが適切な場合の一例です。

Wsdl.exe が、クライアント プロキシ コードを生成するための入力としてこの Web サービスを使用した場合 (ASP.NET Web サービス用の ?wsdl クエリ文字列を使用)、次のシグネチャを持つメソッドが生成されます。

public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)

Begin/End パターンを使用して非同期でメソッドを呼び出す Web サービス クライアントの実装

End メソッドを呼び出すタイミングをクライアントが判断する方法について説明します。.NET Framework で定義されているように、このタイミングを判断する機能をクライアントに実装するには 2 つの手法があります。

  • 待機手法 : WaitHandle クラスのいずれかのメソッドを使用して、そのメソッドの処理が完了するまでクライアントを待機させます。

  • コールバック手法 : コールバック関数を Begin メソッドに渡し、このメソッドの処理が完了したときにそのコールバック関数が呼び出されて結果を取得します。

メモ : クライアントが Web サービスとの非同期通信に上の 2 つの手法のどちらを使用した場合でも、送受信される SOAP メッセージは、同期プロキシ メソッドを介して生成される SOAP メッセージと変わりません。つまり、ネットワーク経由で送受信される SOAP 要求と SOAP 応答は 1 組だけです。これを実現するために、プロキシ クラスでは、Begin メソッドの呼び出しにクライアントが使用したスレッドとは異なるスレッドを使用して SOAP 応答を処理します。したがって、クライアントではそのスレッドで他の作業の実行を続行でき、同時にプロキシ クラスでは SOAP 応答の受信および処理を行うことができます。

Begin/End パターンを使用した待機手法

WaitHandle クラスは、同期オブジェクトがシグナル状態になるまで待機することをサポートする WaitOne メソッド、WaitAny メソッド、および WaitAll メソッドを実装しています。同期オブジェクトがシグナル状態になると、指定したリソースを待機するスレッドがそのリソースにアクセスできるようになったことがわかります。Web サービス クライアントは、Begin メソッドによって返された IAsyncResult オブジェクトの AsyncWaitHandle プロパティを介して、WaitHandle オブジェクトにアクセスします。

この手法の例については、「方法 : 待機手法を使用して非同期 Web サービス クライアントを実装する」を参照してください。

Begin/End パターンを使用したコールバック手法

コールバック手法では、シグネチャを適用する AsyncCallback デリゲートがコールバック関数によって実装されます。

public void MethodName(IAsyncResult ar)

この手法の例については、「方法 : コールバック手法を使用して非同期 Web サービス クライアントを実装する」を参照してください。

コールバック関数で同期/スレッド アフィニティのコンテキストが必要な場合、このコールバック関数はコンテキスト ディスパッチャー インフラストラクチャを通じてディスパッチされます。つまり、このようなコンテキストでは、コールバック関数がその呼び出し元に対して非同期で実行される可能性があります。これが、メソッド シグネチャの一方向修飾子の正確なセマンティクスです。つまり、このようなメソッド呼び出しは、呼び出し元に対して同期または非同期に実行される可能性があるため、呼び出し元は、実行制御が戻された場合でも呼び出しが完了したことを前提にできません。

非同期操作が完了する前に End メソッドを呼び出すと、呼び出し元はブロックされます。Begin メソッドによって返された IAsyncResult を指定して End を 2 回目に呼び出した場合の動作は定義されていません。

イベント ドリブンの非同期パターンを使用する非同期 Web サービス クライアント

Multithreaded Programming with the Event-based Asynchronous Patternでは、イベントを使用してコールバックを処理する新しい非同期プログラミング モデルを導入することにより、ユーザー自身が複雑なマルチスレッド コードを実装することなく、マルチスレッド アプリケーションを簡単に構築できるようになっています。新しいイベント ドリブン非同期モデルの概要については、「Event-based Asynchronous Pattern Overview」を参照してください。この新しいモデルを使用したクライアント実装の詳細については、「How to: Implement a Client of the Event-based Asynchronous Pattern」を参照してください。

イベント ドリブン パターンを使用して Web サービスを構築する方法については、「方法 : ASP.NET 2.0 を使用してイベント ドリブンの非同期 Web サービス クライアントを実装する」を参照してください。

参照

処理手順

方法 : 待機手法を使用して非同期 Web サービス クライアントを実装する
方法 : コールバック手法を使用して非同期 Web サービス クライアントを実装する
方法 : Web サービス クライアントから非同期呼び出しを行う

概念

XML Web サービス クライアントの作成
ASP.NET を使用して作成する XML Web サービスのデザイン ガイドライン

その他のリソース

XML Web サービスのクライアントの作成