通过命名管道使用服务

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 或将合同类型更改为双工服务并让用户应用程序打开服务通道。