2016-01-08 99 views
0

我的情況:windows服務和wcf服務之間的通信

我有一個Windows服務「A」和一個wcf服務「B」託管在其他窗口服務。在我的Windows服務A中,創建一個列表,然後我將其傳遞給wcf服務B.然後,wcf服務B編輯此列表並將必須將其傳回。

我應該如何連接這兩項服務?我必須在wcf服務中引用服務A嗎?或者我必須從我的Windows服務A中創建客戶端並添加服務引用?

我很感謝任何幫助。我花了大量的時間搜索谷歌stackoverflow和msdn,但無法找到 幫助我的東西。

編輯

Windows服務

public long GetSize(string path) 
    { 
     DirectoryInfo direc = new DirectoryInfo(path); 
     long size = CalculateDirectorySize(direc, true); 

     return size; 
    } 

WCF服務

using WindowsService; 

WindowsServiceMethode wsm = new WindowsServiceMethod(); 

public long GetWcfCheck(string path) 
     { 
      long size = wsm.GetSize(path); 

      return size; 
     } 

ASP.Net的webapp

public ActionResult Index() 
     { 
      WCF.CommunicationServiceClient client = new WCF.CommunicationServiceClient("BasicHttpBinding_ICommunicationService"); 
      ViewBag.s = client.GetWcfCheck(@"_somepath_").ToString(); 


      return View("ShowView"); 
     } 

這是傳遞數據的正確方式嗎?

回答

0

這就是我可以從你的問題的理解:

  1. 你有2和Windows服務(服務1和服務2爲簡單起見)
  2. 服務1承載WCF服務
  3. 客服2需要消耗兩WCF服務

的方式方法,如果這一切是正確的,這裏有一些事情你應該做的事情:

WCF服務應配置通過NetNamedPipes進行連接,因爲,如該文章中所解釋的,

NetNamedPipeBinding提供了安全和可靠的結合,其用於在機器的通信最優化。

客服2需要一個服務引用添加到WCF服務,你可以找到如何做到這一點here

既然Service1知道Service2(並且Service2完全不知道Service1),則必須聲明服務方法以允許進行雙向通信。下面是我做的一個實現示例:

[ServiceContract(Namespace = "http://Your.Namespace", SessionMode = SessionMode.Required)] 
public interface ICommunicator 
{ 
    [OperationContract(IsOneWay = false)] 
    string StartServer(string serverData); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)] 
public class CommunicatorService : ICommunicator 
{ 
    public string StartServer(string serverData) 
    { 
     //example method that takes a string as input and returns another string 
     return "Hello!!!!"; 
    } 
} 

編輯:添加客戶端和服務器配置。但是,我必須告訴你,由於我有多個不相關的app.config問題,客戶端配置是通過代碼完成的。

服務器應用程序。配置:

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="MyNamespace.CommunicatorServiceBehavior" name="MyNamespace.CommunicatorService"> 
    <endpoint address="" binding="netNamedPipeBinding" name="netNamedPipeCommunicator" contract="MyNamespace.ICommunicator"> 
    </endpoint> 
    <endpoint address="mex" binding="mexNamedPipeBinding" name="mexNamedPipeCommunicator" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.pipe://localhost/CommunicatorService" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyNamespace.CommunicatorServiceBehavior"> 
     <serviceMetadata httpGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

客戶端的代碼:

private static ICommunicator Proxy; 
ServiceEndpoint endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(ICommunicator))) 
{ 
    Address = new EndpointAddress("net.pipe://localhost/CommunicatorService"), 
    Binding = new NetNamedPipeBinding() 
}; 
Proxy = (new DuplexChannelFactory<ICommunicator>(new InstanceContext(this), endpoint)).CreateChannel(); 
((IClientChannel)Proxy).Open(); 

public void StartServer(string serverData) 
{ 
    string serverStartResult = Proxy.StartServer(serverData); // calls the method I showed above 
} 
+0

你也許有一個鏈接一個解釋app.config文件怎麼樣子? – Drummer

+0

@Duck你想查看服務器的app.config或客戶端的配置嗎? –

+0

兩者都不錯:) – Drummer