c# - 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>
解决方案
它应该在服务器端设置,请注意我们需要使用 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
部分参数可能在客户端生效。建议我们在客户端和服务器端使用相同的设置。如果有什么我可以帮忙的,请随时告诉我。
推荐阅读
- python - 使用泡菜保存模型时出现“TypeError:无法泡菜'_thread.RLock'对象”
- android - 为什么我的按钮在大量计算后被禁用,而在计算之前它首先被调用?
- react-native - 我只想使用以下 JSON 数组在本机反应中呈现一个列表
- c++ - 当我正确地播种生成器时,为什么我会得到相同的随机数?
- javascript - 获取动作计数和增量的最佳方法是什么
- r - 从 R 更新 Excel 工作表有哪些不同的方法
- python - 将字体转换为所有 Web 字体类型
- angular - 如何在刷新时在身份验证保护中获取用户和购物车数据?
- laravel - Axios 删除一个请求的默认标头
- android - 如何在 Kotlin 的 RecyclerView 上实现 longClickListen