当一个人调用IRequestChannel 的Open 方法时到底发生了什么?例如,如果我有以下代码:
ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>();
// using a netTcpBinding to a net.tcp://localhost:9999/Bar
IRequestChannel outchannel = factory.CreateChannel();
outchannel.Open(); // what happens here?
if (outchannel.State == CommunicationState.Opened)
{
success = true;
}
outchannel.Close();
我似乎在某些服务上得到了“误报”,而在其他服务上却出现了准确的失败。如果这不能以某种方式验证 channel 是否打开,我会假设我总是会得到误报。
有什么改进建议吗?我想避免发送消息,因为这只是为了测试服务的诊断测试可行性,但如果有必要,我可以。
我从我们的配置文件中注意到,返回误报的 channel 正在使用以下行为配置:
<binding name="secureNetTcpStream" maxBufferSize="2000000" maxReceivedMessageSize="2000000000" transferMode="Streamed" sendTimeout="00:05:00" receiveTimeout="14:00:00">
<readerQuotas maxStringContentLength="2000000000" maxArrayLength="2000000000" />
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
我想知道流行为配置是否导致 IRequestChannel 在主机和服务不可用时显示它是打开的?
最佳答案
调用Open函数确实会联系服务器端并打开通信 channel 。
但是,可能会出现打开成功但调用服务的其中一个方法失败的情况。
例如:如果客户端调用启动 session 的服务方法并且服务器已达到其最大 session 数,则该函数将失败并出现服务器忙异常。因此,即使您有一个开放的 channel ,您也可能无法创建 session 。
即使 channel 打开成功,服务中也可能存在其他各种故障。
总结: 您的检查很好,但可能还有其他“障碍”会干扰客户端-服务器通信。这些可能是您的误报...
关于WCF 请求 channel ;到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394051/