.NET 4.5でasync/awaitパターンを使用して、WCFでいくつかのサービスメソッドを実装しています。 例サービス:OperationContext.Currentは、WCFサービスでasync/awaitを初めて使用するのを待ってからnullです。
契約:
[ServiceContract(Namespace = "http://async.test/")]
public interface IAsyncTest
{
Task DoSomethingAsync();
}
実装:
MyAsyncService : IAsyncTest
{
public async Task DoSomethingAsync()
{
var context = OperationContext.Current; // context is present
await Task.Delay(10);
context = OperationContext.Current; // context is null
}
}
私が午前問題は、最初のawait
OperationContext.Current
後null
を返し、私はOperationContext.Current.IncomingMessageHeaders
にアクセスすることができないということです。
await
の前にコンテキストを取得できるので、この単純な例では問題はありません。しかし実際のケースでは、OperationContext.Current
は呼び出しスタックの深いところからアクセスされています。コンテキストをさらに渡すためには、たくさんのコードを変更する必要はありません。
await
ポイントの後に手動でスタックを通過させずに操作コンテキストを取得する方法はありますか?
'Task'インスタンスをワイヤでクライアントにシリアル化することは何を意味しますか? – Steven
async/awaitを使用すると、タスクはクライアントに渡されません。 Wcfはvoidを返すメソッドとしてそれを理解しています。そのようなサービスへの参照を追加するクライアントは、void DoSomething()を参照します。 – mdonatas
それは面白いです。それでも、実際にこのような操作を実行したいとは思っていません。何らかの理由で操作が失敗した場合はどうしますか?クライアントはそれが成功裏に成功したと考えます。これらの操作をある種のトランザクションキューに入れておく方がよいでしょう。 – Steven