C# .Net SMTPClient使连接处于等待关闭状态

C# .Net SMTPClient使连接处于等待关闭状态,c#,idisposable,smtpclient,C#,Idisposable,Smtpclient,我有一个问题困扰着我。每隔2到3天,我就会得到与SMTP提供商的连接,但这些连接并没有完成关闭。在服务器上运行netstat会显示状态为CLOSE\u WAIT的连接。我想我把范围缩小到了一个没有被正确处理的物体 特别是.Net SMTPClient类,该类在以前版本的框架中没有实现IDisposable。当我们迁移到4.0框架时,我们从来不需要返回并更新它,这意味着我们一直没有这些错误。几周前,我们开始有这个问题。它始于我们的提供商的服务器出现故障。从理论上讲,他们可能仍然有间歇性的问题,他们

我有一个问题困扰着我。每隔2到3天,我就会得到与SMTP提供商的连接,但这些连接并没有完成关闭。在服务器上运行netstat会显示状态为CLOSE\u WAIT的连接。我想我把范围缩小到了一个没有被正确处理的物体

特别是.Net SMTPClient类,该类在以前版本的框架中没有实现IDisposable。当我们迁移到4.0框架时,我们从来不需要返回并更新它,这意味着我们一直没有这些错误。几周前,我们开始有这个问题。它始于我们的提供商的服务器出现故障。从理论上讲,他们可能仍然有间歇性的问题,他们没有广播。但无论哪种情况,我的代码都需要能够恢复并继续运行

我已经检查了发送电子邮件的每一段代码,它们都被修复了。每个MailMessage对象和每个SMTPClient对象都位于using语句中。然而,我仍然随机得到这个问题。当它真的发生时,似乎发生了多次,非常接近,然后几天内不会发生

最糟糕的问题是,一旦我以这种状态结束了与同一服务器的两个连接,随后的消息池将等待额外的资源,但最终只是超时。重置服务会立即修复此问题


我知道有帖子说可以调整配置以允许更多的同时连接。但这并不能解决问题,只是掩盖了一点而已

我上面的说法不正确

“我知道有帖子说配置可以 可以进行调整以允许更多的同时连接。但这并不适用 解决问题,只是稍微掩盖一下。”

我在配置文件中调整了允许的连接,希望它能给我更多的时间来主动监控问题并主动解决问题,同时继续寻找解决方案

我一添加配置值,问题就完全停止了

<system.net>
  <connectionManagement>
    <add address="{AddressGoesHere}" maxconnection="10" />
  </connectionManagement>
</system.net>

事实上,我们使用较少的服务之一,我没有立即应用配置更新,因为它处理的电子邮件较少,而且不易受影响。最终,当使用量更大的一个仍然像符咒一样工作时,它就坏了

我想知道更多的原因。我最清楚的理解是,我们正在尝试打开比允许的更多的服务器连接,这导致一些连接挂起。默认情况下,有2个连接在后面堆积,在某些情况下,当连接打开时,.NET似乎超时,但在操作系统级别上没有断开连接。(例如,等待连接的时间为28秒,然后需要3秒进行处理,但在30秒时被终止。)

现在我已经允许10个连接,它们同时处理更多的线程,而不是等待插槽打开进行备份。在过去的一周里,我对新配置没有任何问题


我希望这能帮助某人睡得比我好几个晚上:)

我没有答案给你-但你可能想暂时尝试其他电子邮件提供商来缩小原因。由于它与您的提供商的宕机同时发生,因此可能已经到了他们这一步,而您试图调查代码是在浪费时间。谢谢,我已经考虑过这一点,并且强烈希望至少减少一部分,因此我将进行并排比较。我确实认为这会缓解这种情况,但我也觉得,不管提供程序出现错误,我的代码都不应该被锁定。我的一部分真的很想在出现错误时修复它。然后移动到另一个提供商:)。我应该补充一点,我们以前使用Mandrill作为SMTP提供商,但随着他们最近在产品中所做的更改,我们移动到了一个新的提供商。我们跑了几个星期,没有出错。我确实认为,从Mandrill迁移到其他提供商的人数对一些提供商服务器造成了压力。(猜测)但当它直接涉及到它的时候。我的代码应该足够健壮,能够处理来自第三方提供商的问题。