11

我编写了一个系统,它使用带有回调的双工 NetTcp 通道来充当发布/订阅服务器。

如果一段时间后没有发送连接,我是否必须担心回调超时,或者回调管道会无限期地维护?

4

1 回答 1

10

回调不会无限期维护,它会查找您在配置中设置的超时值。如果启用可靠会话,则可以设置客户端的不活动超时。您可以像这样配置超时:

 <netTcpBinding>
    <binding 
             closeTimeout="00:01:00"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:01:00"
             transactionFlow="false" 
           ......>
        <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" />
    </binding>
  </netTcpBinding>

当达到这些值并且仍然没有响应时,您的通信通道出现故障,您需要重新创建客户端代理以使用服务。默认值为receiveTimeout10 分钟,因此您可以增加该值,但也要确保增加您inactivityTimeout的,您的inactivityTimeout应该大于您的receiveTimeout.

编辑:

receiveTimeout您可以根据客户端发送回服务器的值以编程方式不断更改您的值,关键是在服务和客户端上保持的超时值相同。您将在客户端上执行此操作(我从使用 WCF 制作并使用 Silverlight 客户端的聊天服务中获取示例):

//Create different clients dynamically
MyChatServiceClient _client1 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_1");
MyChatServiceClient _client2 = new MyChatServiceClient( "NetTcpBinding_IMyChatService_2");

在客户端配置中:

<!--In your config file, define multiple endpoints/behaviors with different values based on your needs-->
        <bindings>
            <customBinding>
                <binding name="NetTcpBinding_IMyChatService_1" receiveTimeout="00:01:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="283647" maxBufferSize="283647" />
                </binding>
                <binding name="NetTcpBinding_IMyChatService_2" receiveTimeout="00:22:00" ...>
                    <binaryMessageEncoding />
                    <tcpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://192.168.1.51:4520/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_1"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_1" />

          <endpoint address="net.tcp://192.168.1.51:4522/VideoChatServer/"
                binding="customBinding" bindingConfiguration="NetTcpBinding_IMyChatService_2"
                contract="IMyChatService" name="NetTcpBinding_IMyChatService_2" />
        </client>

因此,您可以在客户端或服务器的配置中定义多个端点或绑定,然后根据应用程序中的任何事件,您可以实例化 _clientProxyX 以使用 _serviceInstanceX ,这将具有不同的绑定/端点值,但与您之前的服务实例具有相同的合同. 在上面的示例中,第一个绑定的超时时间为 1 分钟,第二个绑定的超时时间为 2 分钟。需要考虑的重要一点是,如果您希望像这样重新创建新的客户端代理,那么您需要拆除旧的客户端代理并创建一个新的代理,这样可以有效地将您的客户端与服务断开连接,至少暂时如此。

您还可以在实例化新服务主机时在两个服务器上以编程方式修改这些值(等)openTimeoutcloseTimeout您可以根据您在配置中定义的绑定配置之一创建新主机,或者以编程方式创建新配置,如下所示:

var host = new ServiceHost(typeof(MyChatService));
            var webHttpBinding = new System.ServiceModel.WebHttpBinding();
            //Modify new timeout values before starting the host
            webHttpBinding.OpenTimeout = new TimeSpan(1, 0, 0);
            webHttpBinding.CloseTimeout = new TimeSpan(1, 0, 0);
            host.AddServiceEndpoint(webHttpBinding, "http://192.168.1.51/myService.svc");
            //start the host after necessary adjustments
            host.Open();

我知道这看起来很混乱,但关键是 WCF 为您提供了很大的灵活性,能够以编程方式修改您的绑定配置。请务必查看有关修改WCF 配置文件的出色答案。您还可以轻松地以编程方式创建整个服务配置。

于 2012-05-14T15:51:08.223 回答