我有一个简单的WCF服务,我正在与异步通信。
我不喜欢的是调用EndServiceMethod(IASyncResult)
如果我忘记调用Close()
方法,该服务实际上将保持连接打开,然后在wcf达到超时异常的最大并发连接数后,所有剩余的连接都将失败。
我尝试过使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
属性为服务合同,它似乎对服务的连接状态没有任何影响。
也许我错误地实现了它?
任何想法或建议。
我正在尝试找到允许客户端发出请求的WCF行为模式,然后服务器响应请求,然后假设连接已完成并可以终止。
答案 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调用是无稽之谈。