通过命名管道使用服务
Consuming service via Named Pipes
我有两个应用程序使用命名管道公开 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");
}
经过一些研究,我发现 NetNamedPipesBinding 与用于通信的默认命名管道不同,因此存在一些限制。
发生的情况是 Windows 服务不会 运行 在与桌面应用程序相同的用户会话中,并且 NetNamedPipes 无法从服务上下文转到用户会话,就像它一样不能跨越两个不同用户会话之间的边界。
我发现的替代方法是使用纯命名管道方法,不使用 WCF 或将合同类型更改为双工服务并让用户应用程序打开服务通道。
我有两个应用程序使用命名管道公开 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");
}
经过一些研究,我发现 NetNamedPipesBinding 与用于通信的默认命名管道不同,因此存在一些限制。
发生的情况是 Windows 服务不会 运行 在与桌面应用程序相同的用户会话中,并且 NetNamedPipes 无法从服务上下文转到用户会话,就像它一样不能跨越两个不同用户会话之间的边界。
我发现的替代方法是使用纯命名管道方法,不使用 WCF 或将合同类型更改为双工服务并让用户应用程序打开服务通道。