我正在编写带有“状态工具”的Windows服务。该服务托管一个名为WCF的WCF,用于进程间通信。通过命名管道,状态工具可以定期向服务查询最新的“状态”。
在我的开发机器上,我有多个IP地址。其中之一是地址为192.168.1.XX的“本地”网络。另一个是地址为10.0.X.XX的“公司”网络。 Windows服务在单个IP地址上收集UDP多播通信。
到目前为止,只要使用“192.168.1.XX”地址,Windows服务就可以正常工作。它始终如一地向客户端正确报告状态。
切换到另一个“公司” 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接口(interface)的功能无关。它们是应用程序中完全独立的部分!
以下是相关的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();
我不认为这是一个“权限”问题-我正在以管理权限运行客户端-但是也许有某些特定于域的原因导致此中断?
最佳答案
事实证明,该IP地址是一个完整的红色鲱鱼。
发生异常的真正原因是WCF服务返回了无效的Enum值。
我的枚举是这样定义的:
[DataContract]
public enum MyEnumValues : Byte
{
[EnumMember]
Enum1 = 0x10,
[EnumMember]
Enum2 = 0x20,
[EnumMember]
Enum3 = 0x30,
[EnumMember]
Enum4 = 0x40,
}
表面看起来不错。
但是基础服务报告的原始状态是Byte值“0”,并且没有对应的Enum值对其进行强制转换。
一旦我确保Enum值均有效,该工具就会像圣诞树一样亮起。
如有疑问,请假定您的WCF数据无效。
关于c# - WCF NamedPipe CommunicationException- “The pipe has been ended. (109, 0x6d).”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15836199/