2

良い答えを見つけることができなかった WCF スレッドに関する質問があります。IDispatchMessageInspector次のAfterReceiveRequest実装を持つ実装があります。

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   return new SessionScope();
}

のコンストラクターはSessionScope、現在のスコープを基本的にスレッドごとに追跡する辞書に登録します。次に、次の操作があります。

[MyServiceBehavior]
public class Service1 : IService1
{
   public string GetData(int value)
   {
      // Uses SessionScope.Current object for various things
   }
}

以前に WCF メッセージを検査したメッセージ インスペクターと同じスレッドで実行さGetDataれることが保証されますか? 同様に、BeforeSendReply同じスレッドでも実行されますか?

4

2 に答える 2

4

リクエストが同じスレッドに留まる保証はありません。IIS は、スレッド間でそれを渡すことができます (そしてそうします)。

目的を達成するために、オブジェクトを OperationContext.Current (または aspCompatibilityMode がオンになっている場合は HttpContext.Current) にロードできます。オブジェクトを OperationContext.Extensions リストに追加することでそれを行いました。

まず、クラスは IExtension を実装する必要があります

public sealed class SessionScope : IExtension<OperationContext> {
  // your class details here
}

次に、オブジェクトを OperationContext に追加する必要があります。

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
   SessionScope scope = new SessionScope();
   OperationContext.Current.Extensions.Add( scope );
}

その後、スレッドの切り替えに関係なく、どこでも利用できるようになります。

于 2012-12-04T22:15:34.627 に答える
3

IISで実行していると仮定すると、答えはノーです。

IISには「スレッドの俊敏性」と呼ばれるものがあります。これは、単一の要求でスレッドをジャンプできることを意味します。これにはいくつかの問題があります。1つのケースでは、httpコンテキストを使用してこの問題を回避しました。

この質問に対する回答をご覧ください。IISの要求は単一のスレッドで実行されますか?

于 2012-12-04T22:05:12.310 に答える