WCFサービスの非同期パターンとチェーンメソッドに少し問題があります。クライアントが非同期でWCFを呼び出している場合、サービスメソッドは非同期でSOAPプロキシを開き、いくつかのメソッドを呼び出す必要があります。
問題は、Soapサービスの性質がシーケンシャルであるということです。つまり、次の結果を取得して呼び出し元のWCFサービスに返す前に、1つの結果が必要です。私は非同期パターンを使おうとしていますが、ここでは惨めに失敗します。これは、順次呼び出しが完了するまで他の非同期呼び出しをボトルネックにしているためです。
ボトルネックを防ぐために、これらの非同期SOAPメソッドをチェーンする方法はありますか?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class DetailsService : IDetailService
{
public DetailEntity GetDetails(DetailEntity entity)
{
TransactionUtilities.GetTransactionDetails(entity);
// return modified entity with details
return entity;
}
}
public static class TransactionUtilities
{
static SoapClient SoapProxy { get; set; }
public static void GetTransactionDetails(DetailEntity entity)
{
IAsyncResult ar = SoapProxy.BeginExecuteTransaction(loginToken, new AsyncCallback(OnExecuteTransactionEnd), null);
// will this block other async calls?
ar.AsyncWaitHandle.WaitOne();
string transactionId = SoapProxy.EndExecuteTransaction(ar);
// another async call dependent on above transactionId
IAsyncResult ar = SoapProxy.BeginGetTransactionResult(loginToken, processId, new AsyncCallback(OnTransactionResultEnd), null);
ar.AsyncWaitHandle.WaitOne();
Row[] TransactionResult = SoapProxy.EndGetTransactionResult(ar);
// do work with result
}
// call back methods, just haning out doing nothing
static void OnExecuteTransactionEnd(IAsyncResult result) { }
static void OnTransactionResultEnd(IAsyncResult result) { }
}