使用WCF ChannelFactory和连接超时的最佳实践

eco*_*ner 6 wcf timeout channelfactory

我正在开发一个winform应用程序,它将访问作为Windows服务自托管的WCF服务.我使用ChannelFactory而不是服务引用.我已成功连接和调用WCF服务.问题是当我让应用程序闲置20分钟然后尝试再打一次电话时.我收到以下错误:

"套接字连接已中止.这可能是由于处理消息时出错或远程主机超出接收超时或基础网络资源问题引起的.本地套接字超时为'00:00:59.9489970'."

我正在寻找管理连接的最佳实践.我目前已经创建了一个名为PrepareWCFConnection的函数(见下文),它检查通道和ChannelFactory的状态.我在调用WCF服务之前调用此方法.有没有更好的方法来处理这个?

     public bool PrepareWCFConnection()
    {
        if ((channelFactory == null) || 
            (channelFactory.State == CommunicationState.Faulted) ||
            (channelFactory.State != CommunicationState.Opened))
        {
            channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
        }


        if ((proxy == null) ||
            (((IClientChannel)proxy).State == CommunicationState.Faulted) ||
            (((IClientChannel)proxy).State != CommunicationState.Opened))
        {
            proxy = channelFactory.CreateChannel(endpointAddress);
            ((IClientChannel)proxy).Open();
        }

        return true;
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

如果你想重用一个现有的频道,你需要每9分钟ping一次服务来保持频道的活跃.我认为默认的接收超时是10分钟,所以如果它保持闲置超过这个频道,它将被断开.或者你可以使用可靠的会话来保持频道的活跃.

如果您不需要在同一个频道上回拨,最好在完成后关闭频道并为每个服务操作重新创建一个新频道.创建频道并不昂贵.您可以缓存频道工厂,但是为每个电话创建频道.

  • 好点:_您可以缓存频道工厂,但为每个call_创建频道. (2认同)