我在 asp.net 中编写了一个 Web 应用程序。它有一些用户角色。有3个角色,即经理,会计和员工。员工在表格中写下他们的费用并将其发送给经理。经经理批准后,将其发送给会计师支付。我需要有一个想法,当经理在 48 小时内没有批准员工的费用时,它应该向经理的邮箱发送一封自动电子邮件。
我认为我可以编写另一个小型控制台应用程序来通过每小时检查一次来处理它。但这会浪费资源并降低性能。
我需要一个好主意来处理它。我应该怎么做?
我在 asp.net 中编写了一个 Web 应用程序。它有一些用户角色。有3个角色,即经理,会计和员工。员工在表格中写下他们的费用并将其发送给经理。经经理批准后,将其发送给会计师支付。我需要有一个想法,当经理在 48 小时内没有批准员工的费用时,它应该向经理的邮箱发送一封自动电子邮件。
我认为我可以编写另一个小型控制台应用程序来通过每小时检查一次来处理它。但这会浪费资源并降低性能。
我需要一个好主意来处理它。我应该怎么做?
有几种选择,但如果我是你,我会选择第一种或第二种选择。
控制台应用程序和调度程序
我会创建每次运行时为您执行检查的控制台应用程序。然后,如果您愿意,我将使用Windows Scheduler每天(00:05)或每小时运行它。这样,Windows 调度程序守护程序将每小时启动一次,其余时间您的应用程序未运行。
检查此Microsoft 链接以了解如何在 Windows 中创建计划任务。
Restful Web 服务和调度程序
正如@marapet 回答中所建议的那样,拥有一个允许您执行此操作而不是控制台应用程序的宁静 Web 服务将为您提供在您的 Web 应用程序中拥有所有代码的优势。
与前一个类似,您应该只调用 restful uri 来完成您的操作。作为可能的缺点,您必须确保最终用户无法访问该 uri。在通常的架构中(Web 服务器 --> 应用程序服务器 --> 数据库),这个安静的服务应该在应用程序服务器中,远离最终用户的访问。
视窗服务
另一种选择是创建一个始终运行的Windows 服务并检查时间本身,以便每小时执行一次工作(可能使用 Quartz 或类似的)。但这不符合您的性能要求。
无论如何,性能损失都会很小,因为您的服务应该每分钟检查一个小时是否已经过去并且是时候完成它的工作了..这项任务很容易。
优点是 Windows 服务比计划任务更容易控制和监视
数据库作业
还有另一种选择...如果您的应用程序使用 SQL Server,您可以拥有每天或每小时运行的 t-sql 作业。除非您确实遇到性能问题,否则我不会推荐此选项。
这样做的问题是您将拆分代码的逻辑和职责。未来的开发人员或管理员会发现很难维护您的应用程序。
如果为了简单起见,您希望将逻辑保留在 Web 应用程序中(取决于解决方案的总大小,这可能需要也可能不需要):
您可以使用简单的 VBScript(或wget、curl、powershell或任何对您而言最快的方式)调用 URL,然后您可以使用任务调度程序自动执行此操作(另请参阅)。
vbscript 中用于调用 URL的示例脚本:
Function LoadUrl(url)
Dim objRequest
Set objRequest = CreateObject("MSXML2.ServerXMLHTTP.6.0")
objRequest.open "POST", url , false
objRequest.Send
LoadUrl = objRequest.responseText
Set objRequest = Nothing
End Function
每小时检查一次不会影响性能。根据您的数据库,即使每分钟检查一次也可能没问题。最简单的选项是作为计划任务触发的控制台程序。您也可以尝试 Windows 服务,但它们有点棘手。
还要考虑一下如何计算 48 小时。如果员工在周末之前投入费用,那么每次可能都会过去 48 小时,而您最终会遇到经理在周一早上的收件箱中收到大量电子邮件。这可能会引起一些摩擦:)