【发布时间】:2010-10-30 03:16:51
【问题描述】:
这似乎很简单。我需要从一些 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 设置得更高会有所帮助,但我对此表示怀疑。我不想因为 Microsoft 不想遵循 SMTP 规范而冒险禁用我的应用程序池。
编辑:我查看了 quiksoft.com 的组件,但它不支持 SMTP 身份验证,而且价格为 500 美元。一定有办法解决这个问题。
【问题讨论】:
-
根据您提供的链接,该错误似乎已得到修复。您是否可能缺少服务包?
-
我看到上面写着“已解决”。但是我没有看到任何其他注释。我已将服务器更新到最新的 SP 以及所有这些。当我以前看到它时,通常似乎 MS 只是意味着他们不会修复它。他们还列出了我提到的“解决方法”。可能会更清楚。
标签: .net asp.net smtp smtpclient system.net.mail