使用异步模式时,WCF连接超出最大连接数

时间:2010-10-01 19:52:54

标签: c# wcf

我有一个简单的WCF服务,我正在与异步通信。

我不喜欢的是调用EndServiceMethod(IASyncResult)

如果我忘记调用Close()方法,该服务实际上将保持连接打开,然后在wcf达到超时异常的最大并发连接数后,所有剩余的连接都将失败。

我尝试过使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 属性为服务合同,它似乎对服务的连接状态没有任何影响。

也许我错误地实现了它?

任何想法或建议。

我正在尝试找到允许客户端发出请求的WCF行为模式,然后服务器响应请求,然后假设连接已完成并可以终止。

5 个答案:

答案 0 :(得分:4)

这实际上是一个棘手的问题。

一方面,如果你没有关闭连接,它将保持打开状态,直到它超时(1分钟),在负载下你将达到最大连接数(默认为10)。

另一方面,您正在异步调用服务,因此如果在收到回调之前关闭连接,则回调将丢失。

您可以尝试一些事项:

  • 增加最大连接数
  • 关闭回调处理程序中的连接
  • 减少超时的长度

答案 1 :(得分:1)

指定Windows Communication Foundation(WCF)服务的限制机制。

http://msdn.microsoft.com/en-us/library/ms731379%28v=VS.90%29.aspx

答案 2 :(得分:0)

我不知道这是否有帮助:

您可以设置绑定以便

  • 安全性设置为无
  • 禁用可靠会话

        <wsHttpBinding>
            <binding name="MyWsHttpBinding">
                <reliableSession enabled="false"/> 
                <security mode="None" />
            </binding>
        </wsHttpBinding>
    

我发现通过这样做,我可以打开无限数量的频道并“忘记”关闭它们。

然后你必须询问这是否适合你的情况。

答案 3 :(得分:0)

我不会在WCF中使用异步模式。相反,我只使用普通使用块的同步调用来确保连接关闭。然后我将整个混乱包装在一个普通的Task(.NET 4.0)或ThreadPool工作项中。

答案 4 :(得分:-1)

当您不再需要它时关闭任何类型的连接只是开发人员的基本责任。没有什么可抱怨的。关闭连接,你不会有这个问题。尝试以任何其他方式解决缺少的Close调用是无稽之谈。