【问题标题】:Best way to handle mail request and messages [closed]处理邮件请求和消息的最佳方式[关闭]
【发布时间】:2014-08-12 04:02:56
【问题描述】:

我正在构建一个 MVC 应用程序,在这个应用程序中,有些动作暗示了一些事情。因此,我们希望使用邮件系统警告我们的客户/用户。我正在构建一个本地应用程序和一个网上商店,所以有时我需要发送很多邮件。

我目前正在使用MvcMailer 为什么它的工作很好,但我主要担心的是因为它发生在正常的方法调用期间(例如:操作的结果,那么:

        MvcMailMessage msg = mailer.NewOrder(emailTo);

        msg.Send();

消息传出,需要一段时间。而且由于这种操作可能会被调用很多次,因此总体上会减慢整个过程,这是我不希望的。

所以我的问题是:我应该如何处理邮件?我可以使用异步的东西来完成这项工作吗?我是否将它们存储在数据库表中并有时发送它们?我在 windows .Net 中听说过 Task,但我从未使用过,这是一个选项吗?

我正在寻找建议,请随时分享您的意见!谢谢!

【问题讨论】:

  • 您使用的是哪个版本的 ASP.NET?
  • 最新,主要是MVC 5.0。
  • 改进工作代码对于 SO 来说是题外话。尝试程序员/代码审查。我会研究一个专门服务将处理的消息队列。
  • 我很想深入研究类似的东西。你有什么例子或地方可以让我看看这是如何工作的吗?
  • 我猜,最容易设置的是数据库支持的队列和用于发送的 Windows 服务。您还可以查看 MSMQ、计划任务或第三方解决方案。

标签: c# asp.net-mvc email


【解决方案1】:

您可以通过 async-await 关键字使用 SmtpClient.SendMailAsync

public async Task SendSmtpMailAsync()
{
    SmtpClient smtpClient = new SmtpClient();
    MailMessage mailMessage = new MailMessage("FromAddress", "ToAddress", "Subject", "Body");

    await smtpClient.SendMailAsync(mailMessage);
    // Possibly do more stuff here.
}

当您在异步方法上await 时,控制权会返回给调用者。这意味着 ASP.NET 可以同时使用返回给 ASP 的线程来处理消息 NET ThreadPool 从相同的方法。当方法完成时,它将返回到等待的行并继续执行。

请注意,单独使用async 不会将请求返回给调用者,它只会让您同时处理更多请求。您可以做的是将此方法与生产者-消费者样式集合(如BlockingCollection<T>)相关联,将您的消息添加到其中并将响应返回给您的调用者。在后台,使用SendMailAsync 执行这些请求。

【讨论】:

  • 这不会占用请求处理时间的任何时间,它只是意味着您的系统可以通过不占用空闲线程来处理更大的负载。
  • @CodeCaster 它不会,但它会让他同时执行更多请求。我不建议在 ASP.NET 中使用 fire and forget 方法
  • “我主要担心的是,由于它发生在正常的方法调用期间(例如:操作的结果)[...],因此需要一段时间” - OP希望他的应用程序的用户不必等待发送。
  • @CodeCaster 我明白你的意思了。我编辑了我的帖子,以详细说明他如何使用异步 SendMail 实现他的目标
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
相关资源
最近更新 更多