使用 WCF NetNamedPipe 与客户端通信的 Windows 服务

Posted

技术标签:

【中文标题】使用 WCF NetNamedPipe 与客户端通信的 Windows 服务【英文标题】:Windows service using WCF NetNamedPipe to communicate to client 【发布时间】:2012-03-14 03:24:52 【问题描述】:

我写这个问题的原因是,当我尝试通过带有 NetNamedPipe 绑定的 WCF 服务在 Windows 服务和 WPF 应用程序之间进行通信时,我似乎遇到了以下错误:

System.ServiceModel.EndpointNotFoundException:没有端点 在 net.pipe://localhost/Pipe_SendInfo 监听


现在是血淋淋的细节。

好的,我有一个定期执行代码的 Windows 服务,我想让用户知道服务内部发生了什么。所以我读到我可以通过 NetNamedPipe WCF 服务来实现这一点。我创建了两个测试应用程序,并成功地将消息从一个进程发送到另一个进程。然后我尝试将消息从 Windows 服务发送到客户端应用程序(在同一台机器上),但到目前为止失败得很惨:(。

我的 Windows 服务基本上是这样做的(试图发送信息):

ChannelFactory<SkipSyncLib.ISendInfo> pipeFactory =
    new ChannelFactory<SkipSyncLib.ISendInfo>(
        new NetNamedPipeBinding(),
        new EndpointAddress("net.pipe://localhost/Pipe_SendInfo"));

pipeFactory.CreateChannel();
pipeFactory.SendInfo(info);

应该接收信息的应用程序在启动时会这样做:

public void Start()

    HostService = new ServiceHost(this, new Uri[]  new Uri("net.pipe://localhost") );
    HostService.AddServiceEndpoint(typeof(ISendInfo), new NetNamedPipeBinding(), "Pipe_SendInfo");

    try
    
        HostService.Open();
    
    catch (Exception exc)
    
        //Error handling
    

关键在于,虽然 Windows 服务无法找到端点,但我有另一个控制台应用程序能够成功地将信息发送到正在运行的客户端应用程序。所以逻辑会告诉我,它可能与用户有关。但我无法弄清楚。

有什么想法吗?我应该放弃命名管道并使用 http 绑定吗?

我今天早些时候刚刚发现了命名管道,所以如果答案很明显,请保持温和。

谢谢

【问题讨论】:

您运行的是什么操作系统?如果是 Windows Vista 或更高版本,请查看此处:***.com/questions/7477813/…。 Server 2008。我找到了让它工作的方法。客户端应用程序和 Windows 服务需要以同一用户身份运行,以便命名管道可用。 【参考方案1】:

我想出了一个方法让它工作。可能有一种更优雅的方法可以做到这一点,但如果 Windows 服务和客户端应用程序作为同一个用户运行,那么通信通道就可以工作。

【讨论】:

【参考方案2】:

是否应该使用相同的端点地址?

HostService = new ServiceHost(this, new Uri[] new Uri("net.pipe://localhost/Pipe_SendInfo") );

在 Uri 中添加 /Pipe_SendInfo

【讨论】:

以上是关于使用 WCF NetNamedPipe 与客户端通信的 Windows 服务的主要内容,如果未能解决你的问题,请参考以下文章

用于进程间通信的 wcf 服务

如何对 Windows 服务中托管的 wcf 服务进行负载/压力测试?

同一台机器上的IPC...WCF

使用 .NET 客户端时的 SignalR 传输

WCF - 创建简单WCF客户端实现与WCF服务端通信

WCF Java 客户端和 IncludeTimestamp