2016-07-05 164 views
1

我有兩個應用程序公開使用命名管道進行通信的WCF端點。通過命名管道使用服務

一個應用程序是一個WPF用戶應用程序,另一個應用程序是Windows服務,當我從用戶應用程序調用win服務時它沒事,但每當Windows服務調用WPF的應用程序端點時,我都會收到一個System .ServiceModel.CommunicationObjectFaultedException聲明通信對象在發生故障異常時無法使用。

有趣的是,如果我將我的代碼複製並粘貼到控制檯應用程序,它的工作原理就好了。

這裏是我用來創建通信對象

 public void CallService() 
     { 
      using (var channel = GetServiceClient()) 
      { 
       channel.Open(); 

       var service = channel.CreateChannel(); 

       service.DoFoo(); 
      } 
     } 

     private static ChannelFactory<IFooService> GetServiceClient() 
     { 
      return new ChannelFactory<IFooService>(
       new NetNamedPipeBinding 
       { 
        Security = new NetNamedPipeSecurity { Mode = NetNamedPipeSecurityMode.None } 
       }, 
       @"net.pipe://barAddress/fooService"); 
     } 

回答

0

經過一番研究的代碼,我發現NetNamedPipesBinding是不一樣的用於通信的默認命名管道,因此具有一定的侷限性。

會發生什麼情況是Windows服務不能像桌面應用程序那樣在同一用戶會話中運行,並且NetNamedPipes無法從服務上下文轉到用戶會話,就像它無法跨越兩個不同的邊界之間的邊界用戶會話。

我發現的替代方法是使用純粹的命名管道方法,不使用WCF或將合同類型更改爲雙工服務,並使用戶應用程序打開服務通道。

+0

只需更改服務運行的帳戶。無需轉到非WCF命名管道 – MickyD

+0

謝謝@MickyD,但此服務部署到許多用戶擁有最低權限的環境中,因此無法使用在同一用戶上運行。 – bateloche