首页 > 解决方案 > WCF 不活动超时

问题描述

我有一个通信器应用程序,用于在登录到一台机器的用户之间进行通信。应用程序基于 WCF 技术 C#。所以我在 IIS 和客户端应用程序(Windows 窗体)中托管了服务。所有功能都工作正常,除了 10 分钟后客户端应用程序与服务断开连接并且无法再次发送消息。我认为这与默认设置为 10 分钟的 inactivityTimeout 有关。如何将此超时更改为最大值?应该在客户端还是服务端完成?

服务应用设置:

</system.web>
  <system.serviceModel>
    <bindings>
    <customBinding>
      <binding name="netTcpBinding"
                   openTimeout="00:05:30"
                   closeTimeout="00:05:30"
                   sendTimeout="00:05:00"
                   receiveTimeout="24.20:31:23.6470000">
        <reliableSession acknowledgementInterval="00:00:1"
                         inactivityTimeout="24.20:31:23.6470000"/>
      </binding>
    </customBinding>
    </bindings>
    <services>
      <service name="CommunicatorService.CommunicatorService" >
        <endpoint binding="netTcpBinding" contract="CommunicatorService.ICommunicatorService" >
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

客户端设置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_ICommunicatorService" receiveTimeout="24.20:31:23.6470000">
                    <reliableSession inactivityTimeout="24.20:31:23.6470000" />
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://win10/CommunicatorService/Service.svc"
                binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ICommunicatorService"
                contract="CommunicatorService.ICommunicatorService" name="NetTcpBinding_ICommunicatorService">
                <identity>
                    <servicePrincipalName value="host/Win10" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

标签: c#.netwcf

解决方案


它应该在服务器端设置,请注意我们需要使用 Bindingconfiguration 来应用此配置。

   <bindings>
      <customBinding>
        <binding name="netTcpBinding"
                     openTimeout="00:10:30"
                     closeTimeout="00:10:30"
                     sendTimeout="00:10:00"
                     receiveTimeout="00:10:00">
          <reliableSession acknowledgementInterval="00:00:1"
                           inactivityTimeout="00:10:00"/>
        </binding>
      </customBinding>
    </bindings>
  <services>
      <service name="CommunicatorService.CommunicatorService" >
        <endpoint binding="netTcpBinding" contract="CommunicatorService.ICommunicatorService" bindingConfiguration="netTcpBinding" >
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
      </service>
</services>

关于这些参数的含义,请参考以下文档。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/configuring-timeout-values-on-a-binding
https://docs.microsoft.com/en-us/dotnet /api/system.servicemodel.reliablesession.inactivitytimeout?view=netframework-4.8
部分参数可能在客户端生效。建议我们在客户端和服务器端使用相同的设置。如果有什么我可以帮忙的,请随时告诉我。


推荐阅读