2014-01-24 24 views
0

遇到了有關需要在線程之間傳遞的客戶端連接的小問題。在不同進程周圍傳遞ClientConnection

1)我們有一個服務類

public class Service : ServiceBase 
    { 
     public ServiceHost serviceHost = null; 

     public CMLiteService() 
     { 
      ServiceName = "MyService"; 
     } 

     public static void Main() 
     { 
      ServiceBase.Run(new Service()); 
     } 

     protected override void OnStart(string[] args) 
     { 
      try 
      { 
       if (serviceHost != null) 
       { 
        serviceHost.Close(); 
       } 

       Uri baseAddress = new Uri("net.pipe://localhost/Service"); 

       // Step 2 Create a ServiceHost instance 
       serviceHost = new ServiceHost(typeof(Service), baseAddress); 


       // Step 3 Add a service endpoint. 
       serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "Service"); 

       serviceHost.Open(); 

      } 
      catch(Exception e) 
      { 

      } 

     } 

     protected override void OnStop() 
     { 
      if (serviceHost != null) 
      { 
       serviceHost.Close(); 
       serviceHost = null; 
      } 
     } 
    } 

2.)我們有一個接口

[ServiceContract] 
    public interface IService 
    { 
     [OperationContract] 
     string InitalizeDataStore(string uri1, string uri2); 
     [OperationContract] 
     string CheckHealth(); 
     [OperationContract] 
     string CreateObject(string parameters); 
    } 

3。)我們有初始化我們的數據存儲的方法

ObjectOperations objectOperations; 
public InitalizeDataStore (string uri1, string uri2) 
{ 
    Admin admin = new Admin(uri1, uri2); 
    objectOperations = new ObjectOperations(admin.client1, admin.client2); 
} 

4.)下面是實際連接到數據庫的admin類,這兩個客戶端都是線程安全的並支持mu ltithreading

StorageClient1 client1 
StorageClient2 client2 
string URI1; 
string URI2; 

public AdminServices(string uri1, string uri2) 
    { 
     URI1 = uri1; 
     URI2 = uri2; 

     InitializeClient1(); 
     InitializeClient2(); 
    } 

    public StorageClient1 InitializeClient1() 
    { 
     try 
     { 
      client1 = new Client(new Uri(URI1)); 
      client1.Connect(); 
      return client1; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

    public Client2 InitializeClient2() 
    { 
     try 
     { 
      client2 = new Client(new Uri(URI2)); 
      client2.Connect(); 
      return client2; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
    } 

5.)當我們啓動服務並運行初始化方法時,它連接並工作。但是當我們啓動另一個進程時,客戶端連接爲空?如果我們在一個控制檯應用程序中將代碼自上而下運行,但它需要運行初始化,然後必須爲將來的進程設置客戶端連接。

所以進程1:

IService pipeProxy = pipeFactory.CreateChannel(); 
pipeProxy.InitalizeDataStore(); //Returns "Connected" 

Process 2: 
IService pipeProxy = pipeFactory.CreateChannel(); 
pipeProxy.CheckHealth(); //returns null 

我們如何確保客戶端連接細節還在其它工藝製成菱。我也很新,所以我對多線程不太瞭解。

+0

爲什麼你會期望這些東西跨進程存在?作爲一項規則,進程不共享內存。爲什麼不在同一個進程中使用單獨的線程? –

回答

1

我相信你所要完成由WCF Singleton實例模式提供什麼:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 

屬性的實現類以上,和所有客戶端將共享一個實例。

+0

我最近遇到這個屬性。這是否意味着如果我請求了某件事而另一個人請求了同樣的事情,那麼另一個人只有在我送達後纔會收到數據。這種方法是否會影響可擴展性? –

+0

當然。請注意,這種解決方案需要在現有代碼中進行最少量的體系結構更改。如果您願意做出更多更改,我會建議堅持使用SingleCall實例模式(這是默認設置)並重構現有代碼以使服務端WCF類共享Admin類的內部實例(可能是靜態實例使用[Singleton模式](http://msdn.microsoft.com/en-us/library/ff650316.aspx)(不應與WCF的Singleton混淆)。 –