【问题标题】:Consuming service via Named Pipes通过命名管道消费服务
【发布时间】:2016-07-05 23:22:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    经过一番研究,我发现 NetNamedPipesBinding 与默认的用于通信的 Named Pipes 不一样,因此有一定的局限性。

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

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

    【讨论】:

    • 只需更改运行服务的帐户即可。无需使用非 WCF 命名管道
    • 感谢@MickyD,但是这个服务部署在很多用户拥有最低权限的环境中,所以没有办法在同一个用户上同时运行。
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多