2

C#でWCF4を使用しています。Singleに設定されたInstanceContextModeを使用しています。コントラクトを実装するクラスのインスタンスは、サービスをホストするオブジェクトの参照を受け入れるコンストラクターを使用して作成されます。サービスオブジェクトは、サービスホストが作成およびホストされているときに渡されます。

サービス実装コード:

[ServiceBehavior(UseSynchronizationContext = false, 
     InstanceContextMode = InstanceContextMode.Single)]   
public class ServiceImpl : IMyContract
{
   private ServiceHoster _sh;
   ServiceImpl(ServiceHoster sh)
   {
      _sh = sh;
   }

   public string Call(string input)
   {
      ... //Do some processing on the input string

      return _sh.ProcessCall(string input);
   }
}

ServiceHosterコード:

public class ServiceHoster
{
    private ServiceImpl ns;

    ServiceHoster()
    {
       ...
       Start();
    }

    private void Start()
    {
       //Host Service
       ns = new ServiceImpl(this);

        //Instantiate NetTCP service
        _tcpServiceHost = new ServiceHost(ns, new Uri("net.tcp://localhost:8089"));
        _tcpServiceHost.Open();
    }

    private void Stop()
    {
      if(ns != null && ns.State == CommunicationState.Opened)
        ns.Close();
    }

    public string ProcessCall(string input)
    {
       ...
       return result;
    }
}

私が今直面している問題は、クライアントとサーバー間の二重通信が必要なことです。二重接続の場合、InstanceContextModePerSessionに設定する必要があります。

私の質問は次のとおりです。

  1. InstanceContextModeに複数の値を何らかの方法で使用できますか(これは不可能だと思います)?

  2. ServiceImplオブジェクトがそれをホストしているオブジェクトの参照を取得する他の方法はありますか?

  3. 問題を解決するために私が別の方法でできることはありますか?

ありがとう。

4

2 に答える 2

1

まず、InstanceContextModeについて何もする必要はないと思います。接続されているクライアントのリストを保持する方法の詳細については、次のMSDN / WCFフォーラムスレッドを参照してください:http ://social.msdn.microsoft.com/forums/en-US/wcf/thread/463dd4a2-f9db-4773- b373-7dd470e65f90 /

それでもその方法を使用したい場合は、インスタンスプロバイダーを実装することをお勧めします(IInstanceProviderインスタンスを実装し、選択した動作でServiceHostにプラグインします)。

IInstanceProviderをGoogleで使用している場合は、その方法の例を見つけることができます。IoCコンテナーを使用している場合は、このように機能するWCF統合が見つかる可能性があります。

于 2011-05-02T18:27:25.323 に答える
1

次のように、現在のリクエストのserviceHostへの参照を取得します。

OperationContext.Current.Host
于 2011-05-02T18:37:39.803 に答える