【问题标题】:How to run background code in a asp.net-mvc/wcf app如何在 asp.net-mvc/wcf 应用程序中运行后台代码
【发布时间】:2011-03-15 10:32:00
【问题描述】:

基于此答案here,我需要将电子邮件放入队列并运行后台任务并发送它们。如何使用 ASP.NET-MVC 和 WCF 的架构来做到这一点?

  1. 如何建立队列(sql server)?
  2. 如何构建后台任务?

【问题讨论】:

  • 我不确定这是一个很好的方法,但它在 NuGet 上的事实使它很有吸引力。 :) hanselman.com/blog/…

标签: asp.net-mvc wcf email


【解决方案1】:

您可以用多种不同的方式给这只猫剥皮。关键是邮件的实际发送与邮件的排队是异步的。

  1. 通过本系列博客文章使用 MSMQ 绑定通过 WCF 服务对消息进行排队,假设 IIS 7:MSMQ, WCF, and IIS: Getting Them to Play Nice
  2. 将消息排队到 MSMQ。 MSMQ 是 Windows 内置的一个不错的(有时未充分利用)队列服务。您将编写一个 Windows 服务来接收来自该队列的消息。如果您有 IIS 7,请查看 Death to Windows Services, Long Live AppFabric。 MSMQ 轻而易举,但有一些奇怪的限制(4MB 消息大小和可用性)
  3. 将消息排队到“sql 队列”。创建一个表来保存基本的排队消息信息,然后创建一个存储过程来包装队列语义(例如,您不希望多个消费者接收相同的消息)。不难,但要做到正确需要一点时间。
  4. 将消息排队到 Service Broker(甚至 MSMQ),并编写一个 Windows 服务来接收来自 Service Broker 队列的消息。 Service Broker 为您处理排队语义(竞争消费者)。缺点是管理起来很麻烦。

HTH,

Z

【讨论】:

    【解决方案2】:

    我认为您的解决方案与您使用 MVC 的事实无关。

    我过去实现这一点的方式是将您需要发送电子邮件到数据库中的事实持久化,然后使用 Windows 服务进行处理。

    另一种方法是使用 MSMQ 作为存储介质。一般来说,MSMQ 不应该被用来“存储”数据,而只是作为一种消息传输机制,但在这种情况下它肯定是一种选择。

    就开发“队列”而言,如果电子邮件由于某种原因需要按顺序发送,只需在数据库表中添加一个“RequestedDTTM”列即可让您按照请求的顺序发送它们。

    最后,我会考虑实现一个简单的多线程电子邮件发送器以最大限度地提高性能。在 .NET 4.0 中使用 TPL 会使这非常容易。或者,您可以使用 SmartThreadPool 库(可从 codeplex.com 获得)之类的东西来管理您的电子邮件发件人线程。

    正如您链接到的另一个答案中提到的,您的 UI 不应该发送此电子邮件。

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2020-02-12
      • 2019-03-18
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2018-11-21
      • 2019-07-22
      • 1970-01-01
      相关资源
      最近更新 更多