2016-07-05 135 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