解决慢速电子邮件导致的超时错误

时间:2015-03-24 19:08:00

标签: c# asp.net multithreading web-services

问题

我有一个Web服务,可以在数据库中保存记录,有时会向一组用户发送通知电子邮件,让他们知道发生了一个事件。

我从客户端收到 不常见的 超时错误。由于数据已提交到数据库,我认为我的问题是发送SMTP服务器发送电子邮件所花费的时间比客户端上的超时时间长。

需要

我需要做的是在后台发送电子邮件或将其添加到某种队列中以便稍后发送并返回。

约束

  • 我们的网站运行.Net 2.0和IIS 6
  • 我没有服务器的管理员权限,尽管我对我们的网站有文件系统访问权限。虽然我可以说服我们的服务器管理员为我安装自定义Windows服务,但我希望尽可能避免这种情况。
  • 我们的网络服务器陈旧且速度缓慢,并与其他几个网站共享。
  • 此问题发生在重要的在线数据录入系统中,停机时间和错误会导致政治问题。

我已经看过几个解决方案,但需要指出哪种方式最好。

  1. 我可以产生一个线程来发送电子邮件,但我不知道是否这样 会工作,因为Web服务代码将超出范围 回报率。
  2. 我可以将任务添加到某种队列中,并定期发送排队的电子邮件。
  3. 增加客户端的超时并忽略该问题。
  4. 在#2下,我看过J eff Atwood's use of the HttpRuntime.Cache to simulate a windows service,但我非常关注警告

      

    您需要非常小心运行任务的长度。   每个新任务都是一个新的工作线程,并且数量有限   那些 - 因为它“借用”来自托管线程池的线程。

    无响应的网页比我试图解决的错误更糟糕。

    我应该去哪个方向?

    网络服务代码

    [WebMethod(CacheDuration = 0)]
            public static string SaveRecord(comRecord record, IList<QIData> qiItems)
            {
              using (WebDatabase db = new WebDatabase())
              {
                   db.SaveRecord(record, qiItems, UserId, ComId);
                       if (qiItems.Count>0)
                   {
                    /*Then somehow invoke or queue the routine 
                      db.SendQINotice(record,UserId, (int)ComId));
                     */
                   }
               }
            }
    

1 个答案:

答案 0 :(得分:1)

有趣 - 有几种方法可以做到这一点,但由于您在网站上,我会在数据库中的电子邮件队列中添加一个条目,并让另一个任务发送电子邮件。然后,如果您需要在不减慢网站速度的情况下,您可以自由地对电子邮件发送进行更好的错误处理。例如,您可以为此类应用程序添加一些“瞬态”错误处理。如果你对这种方法感兴趣,我可以在我的响应中添加“瞬态”错误处理程序,我用它来重试异常以克服一些临时错误条件。