我有两个应用程序使用命名管道公开WCF端点进行通信。
一个应用程序是一个WPF用户应用程序,另一个是Windows服务,当我从用户应用程序拨打到win服务时,没关系,但每当Windows服务调用WPF的应用程序端点时,我都会收到一个系统。 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 :(得分:0)
经过一番研究,我发现NetNamedPipesBinding与用于通信的默认命名管道不同,因此有一些限制。
Windows Service不会在与桌面应用程序相同的用户会话中运行,并且NetNamedPipes无法从服务上下文转到用户会话,就像它无法跨越两个不同用户之间的边界一样会话。
我找到的替代方法是使用纯命名管道方法,不使用WCF或将合同类型更改为双工服务,并使用户应用程序打开通道到服务。