通过命名管道消耗服务

时间:2016-07-05 23:22:08

标签: c# wpf wcf named-pipes self-hosting

我有两个应用程序使用命名管道公开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");
        }

1 个答案:

答案 0 :(得分:0)

经过一番研究,我发现NetNamedPipesBinding与用于通信的默认命名管道不同,因此有一些限制。

Windows Service不会在与桌面应用程序相同的用户会话中运行,并且NetNamedPipes无法从服务上下文转到用户会话,就像它无法跨越两个不同用户之间的边界一样会话。

我找到的替代方法是使用纯命名管道方法,不使用WCF或将合同类型更改为双工服务,并使用户应用程序打开通道到服务。