C# 使用异步模式时WCF连接超过最大连接数

C# 使用异步模式时WCF连接超过最大连接数,c#,wcf,C#,Wcf,我有一个简单的WCF服务,我正在与它异步通信 我不喜欢调用EndServiceMethod(IASyncResult) 如果我忘记调用Close()方法,该服务实际上会使连接保持打开状态,然后在wcf达到其最大并发连接计数(超时异常)后,所有剩余连接都将失败 我尝试过使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 属性,它似乎对服务连接的状态没有任何影响 也许我没有正确地实现它 任何想法或建议 我试图找到W

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

我不喜欢调用
EndServiceMethod(IASyncResult)

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

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

也许我没有正确地实现它

任何想法或建议


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

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

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

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

您可以尝试以下几点:

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

    • 我不知道这是否有帮助:

      您可以设置绑定,以便

      • 安全设置为“无”
      • 可靠会话被禁用

            <wsHttpBinding>
                <binding name="MyWsHttpBinding">
                    <reliableSession enabled="false"/> 
                    <security mode="None" />
                </binding>
            </wsHttpBinding>
        
        
        
      我发现,通过这样做,我可以打开无限数量的频道,并且“忘记”关闭它们


      然后,您必须询问对于您的环境来说,这是否是一种可接受的配置。

      当您不再需要任何类型的连接时,关闭它只是开发人员的基本责任。没有什么可抱怨的。关闭连接,您将不会遇到此问题。试图以任何其他方式解决丢失的关闭调用都是胡说八道。

      我不会在WCF中使用异步模式。相反,我只使用同步调用和普通的using块来确保连接关闭。然后,我将整个混乱打包在一个普通任务(.NET 4)或线程池工作项中。

      < P>指定Windows通信基础(WCF)服务的节流机制。< /P>

      我一直在回调处理程序中关闭它,这似乎有效。我想我只是希望有一个更优雅的解决方案,让这项工作在服务器端进行。这实际上是最好的解决方案。根据您的代码,您可能能够计算回调处理程序的数量和调用close的次数,并查看它们是否匹配。除了我将有许多客户端,每个客户端都可能有多个连接。公共wcf服务如何做到这一点?我无法想象他们希望他们的客户在完成连接时总是善于关闭连接。@Beta033,公共服务的最大连接数高,超时时间低。我支持@Beta033。我一直使用basicHttpBindings,我发现,即使没有异步调用,wsHttpBinding也会让连接保持打开状态100秒,直到客户端不调用close时超时。客户机在服务器性能方面有这么多发言权,这让我感到非常不舒服。我得出了同样的结论,你所能做的就是设置一个高的最大值和尽可能低的超时时间。我认为你没有抓住要点。关键是允许服务器处理这个问题,而不是强迫客户机维护它。这样,灾难性的通信故障就不会让服务器上的连接处于打开状态并占用插槽。不,我不是。异步调用不能代替关闭连接的需要。顺便说一句,你提到PerCall实例不适合你。你用的是哪种装订?PerCall实例仅适用于不使用传输、可靠或安全会话的绑定。我开始相信,使用工作线程中包装的同步wcf调用将是模拟异步通信的方式。谢谢。在任何有状态通道上进行同步调用后,您仍然必须调用
      Close
      on。