3

当一个人调用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();

我似乎在某些服务上得到了“误报”,而在其他服务上却出现了准确的失败。如果这不能以某种方式验证通道是否打开,我会假设我总是会得到误报。

有什么改进建议吗?我想避免发送消息,因为这只是为了测试服务对诊断测试的可行性,但如果有必要,我可以。


我从我们的配置文件中注意到,返回误报的通道正在使用以下行为配置:

<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 显示它是打开的,即使主机和服务不可用?

4

1 回答 1

2

调用 Open 函数确实会联系到服务器端,并且会打开通信通道。

但是,可能存在 Open 会成功但调用服务的方法之一会失败的情况。

例如:如果客户端调用启动会话的服务方法并且服务器已达到其最大会话数,则该函数将失败并出现服务器繁忙异常。因此,即使您有一个开放的频道,您也可能无法创建会话。

即使通道已成功打开,服务中也可能存在其他各种故障。

摘要:您的检查很好,但可能还有其他“障碍”会干扰客户端-服务器通信。这些可能是你的误报...

于 2008-12-26T19:55:51.773 回答