我的服务主机配置为在10分钟后关闭连接
<wsHttpBinding>
<binding receiveTimeout="00:10:00">
</wsHttpBinding>
在使用服务之前的客户端代码中,它已经过验证。如果它处于关闭/故障状态,它将创建一个新的。
public static T ValidateService<T>(ref T service) where T : class
{
if (service is IClientChannel)
{
IClientChannel channel = service as IClientChannel;
CommunicationState state = channel.State;
if (state == CommunicationState.Faulted || state == CommunicationState.Closed)
{
// thread safe logic to create new service
}
}
}
问题是当服务器端关闭通道并且channel.State仍将返回打开状态。在我进行远程调用后,由于receiveTimeout
而导致出现故障异常。
在客户端有没有办法让不活动超时?像服务器上的receiveTimeout="00:10:00"
,但只有几秒钟,所以如果不使用,我可以很好地关闭来自客户端的通道,如果需要,我的ValidateService<T>
逻辑将创建一个新通道。
出于性能原因,我不想为每个远程呼叫创建新频道,因为这些频道非常频繁。
我希望避免在我的通信中使用我的每项服务时心跳轮询。
由于
答案 0 :(得分:3)
您无法避免处理Faulted
和Closed
,因为某些网络问题或类似问题总是可能会导致您必须创建新的Channel
...
编辑 - 根据评论:
在生产中,我通常有一个客户端实现,它通过重新创建Channel
并重试来处理某些异常...这会处理您正在描述的情况以及其他一些情况,例如网络hickup等。