2011-12-14 48 views
2

WCF多渠道這是我的服務器應用程序的代碼:一個serivce例如

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

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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
class Service : IFirst, ISecond 
{ 
    static int count = 0; 
    int serviceID; 

    public Service() 
    { 
     serviceID = ++count; 

     Console.WriteLine("Service {0} created.", serviceID); 
    } 

    public void First() 
    { 
     Console.WriteLine("First function. ServiceID: {0}", serviceID); 
    } 

    public void Second() 
    { 
     Console.WriteLine("Second function. ServiceID: {0}", serviceID); 
    } 
} 

class Server 
{ 
    static void Main(string[] args) 
    { 
     ServiceHost host = new ServiceHost(typeof(Service), new Uri("net.tcp://localhost:8000")); 
     NetTcpBinding binding = new NetTcpBinding(); 
     host.AddServiceEndpoint(typeof(IFirst), binding, ""); 
     host.AddServiceEndpoint(typeof(ISecond), binding, ""); 
     host.Open(); 

     Console.WriteLine("Successfully opened port 8000."); 
     Console.ReadLine();   
     host.Close(); 
    } 
} 

和客戶端:

class Client 
{ 
    static void Main(string[] args) 
    { 
     ChannelFactory<IFirst> firstFactory = new ChannelFactory<IFirst>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000")); 
     IFirst iForst = firstFactory.CreateChannel(); 
     iForst.First(); 

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

     Console.ReadLine(); 

    } 
} 

當我運行它,我得到的輸出:

Successfully opened port 8000. 
Service 1 created. 
First function. ServiceID: 1 
Service 2 created. 
Second function. ServiceID: 2 

在我的情況下,服務器創建兩個Service實例。我想要做的是調用第二個函數爲與第一次相同的服務實例。

回答

2

你可以做兩件事情:

移動第二至IFirst所以

public interface IFirst 
{ 
    [OperationContract] 
    void First(); 

    [OperationContract] 
    void Second(); 
} 

或者使用辛格爾頓服務實例

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
class Service : IFirst, ISecond 
{ 
... 
} 
+1

+1 for InstanceContextMode.Single;) – 2011-12-20 09:18:56

1

你的行爲更改爲單

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

當您使用InstanceContextMode.PerSession這意味着服務,爲每個client創建a session爲您正試圖通過將其更改爲InstanceContextMode.Single只是服務的一個實例將用於連接到兩個客戶服務這就是爲什麼它正在創建服務

的兩個實例兩個你的客戶。

MSDN

的System.ServiceModel.InstanceContext 管理信道和用戶定義的服務對象之間的關聯 。將 InstanceContextMode枚舉與 ServiceBehaviorAttribute.InstanceContextMode屬性用於指定InstanceContext對象的生命週期 。可以爲每個調用或每個會話創建一個新的 InstanceContext對象,或者指定將InstanceContext對象綁定到單個服務對象。 Single值指定應在服務的生命週期中使用單個InstanceContext對象。

0

我知道這個帖子是舊的,但是對於其他人。

你可以做的是將你的IFirst和ISecond結合到ICombinedService中。 然後,您將在客戶端創建單個通道 - 意味着將創建服務主機會話的單個實例。

在當前的代碼要創建用於IFirst的連接,並且ISecond [這些是你創建的兩個會話實例。]

IFirst iForst = firstFactory.CreateChannel(); //第一個會話創建!

ISecond iSecond = secondFactory.CreateChannel(); //第二次創建!

要改變這種行爲,您需要將服務組合成一個服務;並可以在每個會話上進行通話。

class Client 
{ 
    static void Main(string[] args) 
    { 
     ChannelFactory<ICombinedFirstSecond> combinedFactory = new ChannelFactory<ICombinedFirstSecond>(new NetTcpBinding(), new EndpointAddress("net.tcp://localhost:8000")); 
     ICombinedFirstSecond iCombinedFirstSecond = combinedFactory.CreateChannel(); 
     iCombinedFirstSecond.First(); 
     iCombinedFirstSecond.Second(); 

     Console.ReadLine(); 

    } 
} 

這是我認爲你真的在尋找而不是單身服務。

相關問題