我需要创建一个ASP.NET API服务,在调用时不会等待来自Web服务器的响应。基本上我有一个很长的SQL任务,我想运行,然后当它完成后发送电子邮件给用户告诉他们工作完成。它需要避免服务器响应超时,所以只需让用户继续进行而无需等待。我似乎无法在MVC中找到一种方法来做到这一点,是否可能?
答案 0 :(得分:2)
恕我直言,我会将此作业排队并使用IIS外的其他进程对其进行处理。
例如,这将是流程:
用户向您的API执行请求以启动长任务,但服务器端的API在排队整个任务。
API返回200 OK响应,指定作业已成功排队。 您可以使用Azure Service Bus,Queues,MSMQ,RabbitMQ,Redis甚至SQL Server来使用表来维护作业状态。
某些Windows服务,Azure辅助角色或定期计划任务将任务排队,对其进行处理,一旦结束,它就会向用户发送一封电子邮件,通知操作已完成。
答案 1 :(得分:1)
对任务进行排队并立即返回响应。
基本上,您的服务器端处理程序(控制器操作,Web API方法,等等)不应该直接调用长时间运行的后端任务。它应该做一些相对快速的事情来排队任务,然后立即返回任务已成功排队的指示。另一个过程完全应该实际执行长期运行的任务。
我建议使用两个服务器端应用程序。一个是Web应用程序,另一个是Windows服务或定期安排的控制台应用程序。 Web应用程序会将记录写入数据库表中以排队"队列"这个过程。这可能只包含:
只需在此处插入记录,然后返回给用户即可。此时,Web应用程序已完成其工作。
Windows服务(或控制台应用程序)将检查此数据库表中是否排队"排队"记录。当找到一个时,将状态更新为"处理" (因此其他执行不会尝试运行相同的执行)并调用长时间运行的进程。当长时间运行的过程完成后,将状态更新为"完成" (或者只是删除记录,如果你不再想要它)并通知用户。 (当然,相应地处理错误条件。也许重试,也许会通知用户错误等)。
通过分离这样的问题,您可以在适当的应用程序上下文中放置相应的职责,并为用户提供他们正在寻找的体验。您还可以为将来的功能打开大门,例如通过Web应用程序以外的方式排队进程或在排队/运行/失败/等上运行报告。通过检查该数据库表进行处理。
长话短说:不要试图破解Web应用程序,使其不像Web应用程序那样行事。将这些技术用于适当的目的。