我正在编写带有“状态工具”的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/

10-17 02:34