2011-12-14 88 views
0

我是WCF新手,仍在嘗試。WCF交換服務接口

我有兩個的ServiceContract這樣的:

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

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

在實現這些接口的服務器端Client類:

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,但對於同一個Client實例。它甚至有可能嗎?我知道我可以將這兩種方法放在一個服務中,但這不是我所希望的。

回答

1

根據我的理解,您希望在創建僅一個客戶端時調用這兩種方法。 在WCF中,您可以通過設置Service Behavior Attribute的InstanceContextMode屬性來控制Instancing。有三種可能的值 -PerCall -PerSession - 單

您可以使用PerSession,因爲它使對象主動從客戶端的下一個電話。當會話結束

可以裝飾你的類 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

希望這有助於 的對象被釋放。

0

起初我是被你叫你的服務實現「客戶」小糊塗:P

但無論如何,在默認情況下,WCF使用InstanceContextMode.PerCall,這意味着它將實例化一個新的服務實現實例每次請求都進入服務。

如果您希望在同一服務實例中處理後續服務調用,則必須使用PerSession或Single InstanceContextModes。

http://msdn.microsoft.com/en-us/library/ms731193.aspx總結了WCF中的會話,實例和併發性。