2011-12-14 8 views
0

私はWCFで新しく、まだ実験中です。WCFスワップサービスインターフェイス

私はこのような2つのServiceContractがあります。これらのインタフェースを実装し、サーバーサイドのClientクラスで

[ServiceContract] 
public interface IFirst 
{ 
    [OperationContract(IsOneWay = true)] 
    void First(); 
} 

[ServiceContract] 
public interface ISecond 
{ 
    [OperationContract(IsOneWay = true)] 
    void Second(); 
} 

public class Client : IFirst, ISecond 
{ 
    static int count = 0; 
    int id; 

    public Client() 
    { 
     count++; 
     id = count; 
     Console.WriteLine("{0} client created.", id); 
    } 

    public void First() 
    { 
     Console.WriteLine("First from: " + id.ToString()); 
    } 

    public void Second() 
    { 
     Console.WriteLine("Second: " + id.ToString()); 
    } 
} 

とホスト:クライアント側で

ServiceHost host = new ServiceHost(typeof(Client), new Uri("net.tcp://localhost:8000")); 
NetTcpBinding binding = new NetTcpBinding(); 
host.AddServiceEndpoint(typeof(IFirst), binding, ""); 
host.AddServiceEndpoint(typeof(ISecond), binding, ""); 
host.Open(); 

ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000")); 
IFirst iFirst = firstFactory.CreateChannel(); 
iFirst.First(); 

ChannelFactory<ISecond> secondFactory = new ChannelFactory<ISecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000")); 
ISecond iSecond = secondFactory.CreateChannel(); 
iSecond.First(); 

これは問題なく動作します。これはFirstメソッドとSecondメソッドを呼び出しますが、各呼び出しでClientクラスの新しいインスタンスが作成されます。クライアントがチャネルを作成すると、サービスはClientオブジェクトの新しいインスタンスを作成するため、明らかです。私が達成したいのは、Second after Firstを呼び出すことですが、Clientの同じインスタンスに対して呼び出します。それも可能ですか?私はこの2つの方法を1つのサービスに入れることができますが、私が望むものではありません。

答えて

1

私の理解によれば、1つのクライアントのみを作成しているときに2つのメソッドを呼び出す必要があります。 WCFでは、サービス動作属性のInstanceContextModeプロパティを設定して、インスタンス化を制御できます。それは、クライアントからの次の呼び出しのためのアクティブなオブジェクトを保持してあなたがPerSessionを使用できる3つの可能な値 -PerCall -PerSession - シングル

があります。セッションは、あなたのクラスにこのことができます [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

希望を飾ることができます

終了時 オブジェクトが解放されます。

0

は、最初に私はあなたのサービスの実装「クライアント」を呼び出すことによって、少し混乱していた:P

しかし、いずれにせよ、デフォルトでは、WCFは、それがために、新たなサービスの実装のインスタンスをインスタンス化することを意味InstanceContextMode.PerCallを、使用していますサービスへのすべてのリクエスト。

同じサービスインスタンス内で後続のサービス呼び出しを処理する場合は、PerSessionまたはSingle InstanceContextModesのいずれかを使用する必要があります。

http://msdn.microsoft.com/en-us/library/ms731193.aspxは、WCFのセッション、インスタンス、並行性をきちんとまとめています。