这似乎很简单。我需要从一些 ASP.NET 应用程序发送电子邮件。我需要始终如一地做到这一点,而不会出现奇怪的错误,也不会出现 CPU 利用率过高的情况。我不是在谈论群发电子邮件,只是偶尔发送电子邮件。
System.Net.Mail似乎被严重破坏了。SmtpClient 不发出 Quit 命令(可能是因为 Microsoft(R) 对以下规范不感兴趣),因此连接保持打开状态。因此,如果有人在该连接最终关闭之前尝试发送电子邮件,您可能会从 SMTP 服务器收到关于打开的连接过多的错误。这是 Microsoft(R) 对修复完全不感兴趣的错误。看这里:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711
另外,如果您环顾四周,建议使用此代码来解决此问题:
smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
好的,是的,这确实“解决”了连接保持打开状态的问题。但是,如果您愿意,这始终如一地在服务器上尝试,这会导致运行进程(在本例中为 w3wp.exe)的 CPU 跳跃并保持在 100%,直到您的应用程序池被回收。无论出于何种原因,运行 mscorwks.dll!CreateApplicationContext 的线程都是罪魁祸首。
这有一个非常好的副作用,如果您在一个对持续 100% 的 CPU 使用不满意的 Web 主机上运行,您将禁用您的应用程序池。因此,这并不像某些人建议的那样微不足道。
所以我的问题是怎么办?我需要做的就是这么简单;然而,让那些“打开的连接太多”错误是不可接受的,100% 的 CPU 使用率也是不可接受的。我不想购买第三方组件,不是因为我便宜,而是我购买了足够多的组件和 MSDN 订阅,以至于不得不为简单的 SMTP 功能支付 100 到 300 美元似乎很疯狂。
我读到将 MaxIdleTime 设置得更高会有所帮助,但我对此表示怀疑。我不想因为微软不想遵循 SMTP 规范而冒险禁用我的应用程序池。
编辑: 我查看了 quiksoft.com 组件,但它不支持 SMTP 身份验证,而且价格为 500 美元。一定有办法解决这个问题。