WCF RequestChannel;真的发生了什么?

时间:2008-12-26 17:52:40

标签: wcf service

当一个人调用 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显示即使主机和服务不可用也会打开它?

1 个答案:

答案 0 :(得分:2)

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

但是,可能会出现Open成功但调用该服务的某个方法失败的情况。

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

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

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