2014-01-07 12 views
5

202 approachを使用して非同期REST APIを作成しています。私はこれをWCF(Web APIではなく)で実装しなければならず、私の計画は、非同期作業を実行するための新しいスレッドを生成し、WCFオペレーションスレッドが202を返すようにすることです。私が実行している問題は、新しいスレッドで使用する必要があるのは、コンテキスト情報を格納および取得するためにOperationContextおよびHttpContextが必要になることです。私は、これらの両方がスレッド固有であり、その結果、生成されたスレッドではnullであることを知っています。非同期WCF RESTサービス内のスレッド間のコンテキスト

私は2つの質問があります。

  1. は、新しいスレッドにのOperationContextおよび/または のHttpContextを伝播する任意の安全な方法はありますか?
  2. OperationContextとHttpContextから離れて移動するように従来の コードを変更できる場合は、 WCF設定のスレッド間でコンテキスト情報を共有することをお勧めしますか?
+0

コードサンプル –

答えて

1
  1. あなたが必要なコンテキストを受け取る生み出す任意のスレッドを確保するための責任を負うことになります。 WCFは、開始する任意のスレッド切り替えでOperationContextフローを保証する責任しか負いません。そのため、コンテキストデータを格納するための推奨方法はIExtension<OperationContext>です。あなたが建物を残したら、スレッドプールの産卵タスクについては

  2. は、典型的なアプローチが必要なすべてのコンテキスト情報を準備して、例えば、デリゲートに至るまでそれを渡すことであろう...自分自身にしていますTask.Run(() => doLongRunningTask(contextCopiedFromOperationContext))。デリゲートは、実際に長時間実行される実装を呼び出す前に、ThreadLocal<T>オブジェクト(または使用するメカニズム)を設定する責任があります。

+0

ありがとうございました。 IExtension に関するあなたのコメントに関連して、私は、従来のコードのHttpContext.Itemsの使用をOperationContext拡張を使用するように変更する予定です。 HttpContextよりもOperationContext(たとえばOperationContextScope)を管理するための方がずっと優れているようですが、ASP/System.Webへの依存から遠ざかります。 – BitMask777

+1

サーバー側では、OperationContextとHttpContextはかなり似ています。いずれかを使用すると、リクエストの期間中、利用可能な状態に頼ることができます。 HttpContextを使用する利点は、WCFとASP.NETの機能を同じサーバーにホストしている場合、一貫したメカニズムを使用できることです。もう1つの利点は、HttpContextがOperationContext(以前に作成され、パイプラインの後半に配置されている)よりも長持ちすることです。 –

関連する問題