【发布时间】:2013-03-28 00:03:43
【问题描述】:
我正在编写一个带有“状态工具”的 Windows 服务。该服务托管一个 WCF 命名管道端点,用于进程间通信。通过命名管道,状态工具可以定期向服务查询最新的“状态”。
在我的开发机器上,我有多个 IP 地址;其中之一是具有 192.168.1.XX 地址的“本地”网络。另一个是“公司”网络,地址为 10.0.X.XX。 Windows 服务在单个 IP 地址上收集 UDP 多播流量。
到目前为止,只要 Windows 服务使用“192.168.1.XX”地址,它就可以正常工作。它始终如一地向客户端正确报告状态。
当我切换到另一个“公司”IP 地址 (10.0.X.XX) 并重新启动服务时,我在检索状态时收到连续的“CommunicationExceptions”:
"There was an error reading from the pipe: The pipe has been ended. (109, 0x6d)."
现在,我认为 UDP 客户端的“已声明”IP 地址与 Named-Pipe 接口的功能没有任何关系;它们是应用程序的完全独立部分!
以下是相关的 WCF 配置部分:
//On the Client app:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
ChannelFactory<IMyService> proxyFactory =
new ChannelFactory<IMyService>(
new NetNamedPipeBinding(),
new EndpointAddress(myNamedPipe));
//On the Windows Service:
string myNamedPipe = "net.pipe://127.0.0.1/MyNamedPipe";
myService = new MyService(myCustomArgs);
serviceContractHost = new ServiceHost(myService );
serviceContractHost.AddServiceEndpoint(
typeof(IMyService),
new NetNamedPipeBinding(),
myNamedPipe);
serviceContractHost.Open();
我不认为这是一个“权限”问题 - 我正在以管理权限运行客户端 - 但可能有一些特定于域的原因导致此问题中断?
【问题讨论】:
-
异常堆栈跟踪是什么样的?你确定没有其他改变吗?切换服务配置后是否重启了状态工具?您能否发布您的状态工具代码部分,它实例化您的 rpoxy 并进行 WCF 调用?
-
我会在星期一恢复工作时更新这个问题。也有朋友提出,IP地址可能是红鲱鱼,真正的区别可能是特定Enums的返回值。我也会对此进行调查。
标签: c# wcf windows-services named-pipes