【问题标题】:ASP.NET MVC + SQL Server Application: Best Way to Send Out Event-Driven E-mail NotificationsASP.NET MVC + SQL Server 应用程序:发送事件驱动电子邮件通知的最佳方式
【发布时间】:2010-11-29 22:46:51
【问题描述】:

我有一个在后端使用 NHiberante 和 SQL Server 2008 的 ASP.NET MVC 应用程序。需要每天/每周发送事件驱动通知和每周发送一般通知。

以下是事件驱动工作流程需要如何工作的示例:

  1. 员工创建多个采购订单。
  2. 每天都会向具有下属员工的任何主管发送一封电子邮件通知,该下属员工已下达采购订单,其中包含下属创建的所有采购订单的清单,需要他的批准。主管应该只收到一次(例如,如果员工 A 创建了一个采购订单,在他批准之前,他的主管不应该每天都收到一封电子邮件)。此外,采购订单清单应仅包括主管未采取行动的订单。如果没有采购订单需要特定主管的批准......他们不应该收到电子邮件。
  3. 每天都会向部门经理发送一封电子邮件通知,其中包含下属主管以与上述 #2 类似的方式批准的所有采购订单的清单。
  4. 任何时候采取任何行动来批准主管或部门的采购订单。经理,员工应该每天收到一封电子邮件通知,列出所有此类更改。如果给定员工没有邮件,他们根本不应该收到电子邮件。

所以给定这样的工作流程:

  • 安排此类通知每天、每周甚至在事件发生后立即发生的最佳方式是什么?
  • 您如何确保此类事件驱动的通知仅发送一次?
  • 您将如何处理异常以确保记录发送电子邮件的失败尝试并在第二天尝试发送?

谢谢!

【问题讨论】:

    标签: asp.net asp.net-mvc email notifications


    【解决方案1】:

    您可以在控制器中添加正常操作

    Function SendEmails() As ActionResult
        Dim result As String = ""
        ''//big timeout to handle the load
        HttpContext.Server.ScriptTimeout = 60 * 10 ''//ten minutes
    
        result = DoTheActualWork()
    
        ''//returns text/plain
        Return Content(result)
    
    End Function
    

    然后从计划任务中调用页面。可以是服务器或任何机器上的计划任务。为此使用 .vbs:

    SendEmails.vbs:

    ''//Force the script to finish on an error.
    On Error Resume Next
    
    ''//Declare variables
    Dim objRequest
    Dim URL
    
    Set objRequest = CreateObject("Microsoft.XMLHTTP")
    
    ''//Put together the URL link appending the Variables.
    URL = "http://www.mysite.com/system/sendemails"
    
    ''//Open the HTTP request and pass the URL to the objRequest object
    objRequest.open "POST", URL , false
    
    ''//Send the HTML Request
    objRequest.Send
    
    ''//Set the object to nothing
    Set objRequest = Nothing
    

    【讨论】:

    • 如果正在发送大量电子邮件,这可能会超时吗?
    • 可能是的(这取决于邮件服务器、Web 服务器硬件等)。对其进行测试并相应地调整HttpContext.Server.ScriptTimeout 设置
    【解决方案2】:

    我会先将您的所有电子邮件、通知等保存到数据库/表中,然后使用一项服务来轮询此数据库或表中的新条目,以处理电子邮件/通知的实际发送。

    为了解决您的特定情况,您可以让控制器在需要电子邮件/通知时写入数据库,并且执行间隔/事件特定检查的服务也写入数据库以创建新电子邮件。这样,您的应用程序和服务就不会真正关心这些通知是如何发生的或发生了什么,它们只是说,“嘿,做点什么吧。”并且电子邮件/通知服务实际上正在执行。

    这样做的好处是,如果您的电子邮件提供商出现故障,您不会丢失任何电子邮件,并且您拥有发送的所有电子邮件的历史记录,以及发送时间、谁等的详细信息……您也可以删除或更改电子邮件发送者可以做更多事情,例如发送到 Twitter 或手机短信等。这有效地将您的通知与您的应用程序分离。

    我最近做的所有应用程序都使用这种类型的模型,它已经阻止了由于服务故障和其他原因导致的电子邮件丢失。它还可以查找通过系统的所有电子邮件并获取指标,这些指标允许我通过在电子邮件记录中存储额外信息(如发送原因、是否报告错误等)来优化发送电子邮件的需求。 .. 添加诸如基于一天中的时间或用户的路由通知(例如,如果是电子邮件,则转到短信)之类的附加功能已成为可能,而无需更改主要应用程序。

    您的客户可能认为他们今天需要的只是电子邮件,但您应该确保您的解决方案足够灵活,以便在未来只需短短 tweek 即可处理更多电子邮件。

    【讨论】:

    • 关于已发送通知的跟踪和存档问题......记录所有交易,你可以进入谷歌的搜索引擎。仅搜索订单号即可获得所有相关交易。应用一些简单的过滤,你会得到一些非常有趣的可能性——在这些“电子邮件”中嵌入正确的链接,你可以绑定到应用程序的 cms 或报告子系统中。
    【解决方案3】:

    听起来像是一项服务的工作或计划的工作。

    您不想在 ASP.NET 中执行此操作,因为您必须配置 IIS 才能让您的应用始终保持活动状态,这可能不是最好的主意。

    计划任务很好,但您必须使用所有逻辑对其进行编程以解析数据。不是分离关注点的最佳选择。如果发生变化,您还必须更新两个代码库。

    服务并不理想,因为它只会真正每天做一次。但是您可以设置 wcf 服务并让网站使用该服务排队电子邮件。

    【讨论】:

      【解决方案4】:

      这可以使用 SQL Server 代理来完成,请在此处阅读更多相关信息:

      http://msdn.microsoft.com/en-us/library/ms189237.aspx

      【讨论】:

        【解决方案5】:

        您可以托管 Windows 工作流或 Windows 服务。并设置一个消息队列来处理这些事件。您可以只将数据库用于消息队列,也可以使用 ms 消息队列或在数据库中使用触发器。但是这种功能真的不应该是你的前端网络应用程序的责任。如果推送到了紧要关头,您可以在您的 asp.net 应用程序中生成另一个线程来处理此队列。

        【讨论】:

          猜你喜欢
          • 2016-02-09
          • 2013-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-20
          • 1970-01-01
          • 2014-02-03
          • 2015-02-16
          相关资源
          最近更新 更多