我正在尝试使用WCF可靠会话来启用从服务到客户端的回调。此回调通道需要无限期打开。
某些.NET版本中似乎存在允许reliable sessions fault prematurely的错误。应该没问题,只需将inactivityTimeout和receiveTimeout设置为足够高的值(例如TimeSpan.MaxValue
)。
但无论我如何配置我的客户端和服务,无论我设置为超时的值如何,该通道在10分钟后仍会出现故障。
如果没有我的配置,这个问题就不完整了,所以在这里:
<!-- service's app.config -->
<!-- irrelevant stuff snipped .. -->
</binding>
<netTcpBinding>
<!-- enable reliable sessions, set timeouts to their maximum possible value!!! -->
<binding name="netTcpReliable" receiveTimeout="infinite">
<reliableSession enabled="true" inactivityTimeout="infinite"/>
</binding>
</netTcpBinding>
</binding>
<services>
<service name="SomeService" behaviorConfiguration="metadataBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:port/SomeService"/>
</baseAddresses>
</host>
<endpoint name="SomeService_BasicTcpEndpoint"
address="service"
binding="netTcpBinding"
bindingConfiguration="netTcpReliable"
contract="ISomeService" />
</service>
<services>
// client's binding generation code
var binding = new NetTcpBinding(SecurityMode.Transport, true) // enable reliable session
{
OpenTimeout = openCloseTimeout,
CloseTimeout = openCloseTimeout,
SendTimeout = sendTimeout,
ReceiveTimeout = TimeSpan.MaxValue // maximum possible value (infinite in app.config)
};
binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue; // maximum possible value (infinite in app.config)
var factory = new ChannelFactory<TChannel>(binding);
return factory.CreateChannel(endpointAddress);
因此,正如您所看到的,所有超时都配置为高于10分钟的值,并且在没有任何服务呼叫的情况下,仍然会在10分钟后精确地发生故障。我怎么能绕过这个呢?据我所知,可靠的会话(除此之外)完全用于此:保持通道存活并防止它们发生故障(通过发送基础设施保持活动数据包 - 至少在没有aforementioned bug的最新.NET版本中)。
答案 0 :(得分:0)
你应该在编译期间得到警告,无限期超时没有合法价值。 最大超时约为24天。