WCF如果由于不活动而被服务器关闭,我怎么能避免出现故障

时间:2011-11-08 14:20:32

标签: c# wcf timeout wcf-binding

我的服务主机配置为在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>逻辑将创建一个新通道。

出于性能原因,我不想为每个远程呼叫创建新频道,因为这些频道非常频繁。

我希望避免在我的通信中使用我的每项服务时心跳轮询。

由于

1 个答案:

答案 0 :(得分:3)

您无法避免处理FaultedClosed,因为某些网络问题或类似问题总是可能会导致您必须创建新的Channel ...

编辑 - 根据评论:

在生产中,我通常有一个客户端实现,它通过重新创建Channel并重试来处理某些异常...这会处理您正在描述的情况以及其他一些情况,例如网络hickup等。