2

我们需要能够在某些日期发生或满足某些业务条件时发送自动电子邮件。我们正在设置这个系统以与现有的 ASP.NET 网站一起工作。我在这里与其他一位开发人员进行了交谈,并讨论了一些问题。

注意事项:

  • 我们需要的所有信息都已在 ASP.NET 网站中建模
  • 电子邮件生成需要一些业务逻辑,这些逻辑也已经在网站中

我们认为理想的解决方案是拥有一个单独的可执行文件,该可执行文件计划在夜间运行并进行处理和发送电子邮件。该解决方案有两个主要问题:

  • 如果网站已更新(业务逻辑或模型)但可执行文件意外丢失,则可执行文件可能会停止发送电子邮件,或者更糟糕的是,基于过时的逻辑发送电子邮件。
  • 我们希望使用这样的东西使用 UserControls 来模板化电子邮件,我认为这在 ASP.NET 网站之外是不可能的

第一个问题可以通过构建和部署脚本来避免(我们目前正在研究),但我认为我们无法解决第二个问题。

所以我们决定的解决方案是拥有一个由 SSIS 定期调用的 ASP.NET 页面,并让它执行一定数量的处理(比如 30 秒)然后返回。我知道 ASP.NET 页面不是进行此类处理的理想场所,但这似乎最能满足我们的要求。我们考虑产生一个新线程(不是从工作池中)来进行处理,但决定如果我们这样做,我们就不能使用返回的页面来表示成功或失败。通过在页面的生命周期内进行处理,我们可以使用页面内容来指示处理是如何进行的。

所以问题是:这个设置是否存在任何技术问题?

显然,如果您尝试过这样的事情,任何成功/失败的报告都会受到赞赏。与替代设置的建议一样。

干杯,

4

6 回答 6

3

不要使用 asp.net 线程来执行此操作。如果站点正在生成一些您需要的信息以创建或触发电子邮件发送,则让站点将一些信息写入文件或数据库。

创建一个 Windows 服务或计划进程,从该文件或数据库中收集所需的信息,并在完全独立的进程/线程上运行电子邮件发送进程。

您要避免的是由于流程处理程序的限制而使您的网站崩溃或使您的电子邮件程序崩溃。根据您在问题标题中使用“批量”一词,两者需要相互独立。

于 2010-01-19T23:07:00.093 回答
2

我觉得你应该没问题。我们公司多年来一直使用类似的方法,并没有遇到很多问题。有时需要一个多小时才能完成该过程。最近我们将第二个线程(如您所说)移至单独的服务器。

于 2010-01-19T23:10:08.573 回答
1

将电子邮件发送器和网站耦合在一起可以工作,但这并不是一个真正的好设计,从长远来看,这对您来说将是更多的维护。你可以通过做一些事情来解决你所说的问题。

  1. 将通用业务逻辑移至 Web 服务或通用库。您的网站和可执行/WCF 服务都可以使用它,并且它集中了逻辑。如果您正在复制和粘贴代码,您就知道出了点问题;)

  2. 如果您需要一个模板邮件程序,可以调用 ASP.Net 类为您动态创建页面(请参阅BuildManager类和类似这样的博客文章。如果邮件程序不依赖于页面事件(它不) t 似乎),您的可执行文件从您的网站程序集中加载 Page 类,动态构建它并填写内容应该没有任何问题。

这显然代表了大量的工作,但会为您带来更具可扩展性的解决方案。

于 2010-01-19T23:10:13.753 回答
0

听起来你应该创建一个工作线程来完成这项工作。

于 2010-01-19T22:58:28.243 回答
0

也许你应该看看类似https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

于 2010-01-19T23:06:00.580 回答
0

当满足某些业务条件时,您可以并且应该在域逻辑(这意味着您的 asp.net 应用程序)中构建您的消息正文(模板化消息正文)并将其发送到应该只发送您的消息的外部服务。所有消息都将包含适当的信息。

对于“当某些日期发生”场景,您可以对后台任务使用简单的解决方案(查看Craig的答案)并执行与上述相同的操作:解析模板、构建消息并快速发送到指定服务。

当然,您应该安全地执行此操作,然后应用程序池重新启动不会中断您的任务。

于 2010-01-20T00:21:04.407 回答