创建没有超时的MVC Web服务

时间:2014-07-24 14:09:33

标签: c# .net asp.net-mvc

我需要创建一个ASP.NET API服务,在调用时不会等待来自Web服务器的响应。基本上我有一个很长的SQL任务,我想运行,然后当它完成后发送电子邮件给用户告诉他们工作完成。它需要避免服务器响应超时,所以只需让用户继续进行而无需等待。我似乎无法在MVC中找到一种方法来做到这一点,是否可能?

2 个答案:

答案 0 :(得分:2)

恕我直言,我会将此作业排队并使用IIS外的其他进程对其进行处理。

例如,这将是流程:

  1. 用户向您的API执行请求以启动长任务,但服务器端的API在排队整个任务。

  2. API返回200 OK响应,指定作业已成功排队。 您可以使用Azure Service Bus,Queues,MSMQ,RabbitMQ,Redis甚至SQL Server来使用表来维护作业状态。

  3. 某些Windows服务,Azure辅助角色或定期计划任务将任务排队,对其进行处理,一旦结束,它就会向用户发送一封电子邮件,通知操作已完成。

答案 1 :(得分:1)

对任务进行排队并立即返回响应。

基本上,您的服务器端处理程序(控制器操作,Web API方法,等等)不应该直接调用长时间运行的后端任务。它应该做一些相对快速的事情来排队任务,然后立即返回任务已成功排队的指示。另一个过程完全应该实际执行长期运行的任务。

我建议使用两个服务器端应用程序。一个是Web应用程序,另一个是Windows服务或定期安排的控制台应用程序。 Web应用程序会将记录写入数据库表中以排队"队列"这个过程。这可能只包含:

  • 排队过程的用户
  • 排队时
  • 排队的进程(例如,如果有多个进程)
  • 流程状态("排队"最初)
  • 您可能想要存储的任何其他内容。

只需在此处插入记录,然后返回给用户即可。此时,Web应用程序已完成其工作。

Windows服务(或控制台应用程序)将检查此数据库表中是否排队"排队"记录。当找到一个时,将状态更新为"处理" (因此其他执行不会尝试运行相同的执行)并调用长时间运行的进程。当长时间运行的过程完成后,将状态更新为"完成" (或者只是删除记录,如果你不再想要它)并通知用户。 (当然,相应地处理错误条件。也许重试,也许会通知用户错误等)。

通过分离这样的问题,您可以在适当的应用程序上下文中放置相应的职责,并为用户提供他们正在寻找的体验。您还可以为将来的功能打开大门,例如通过Web应用程序以外的方式排队进程或在排队/运行/失败/等上运行报告。通过检查该数据库表进行处理。

长话短说:不要试图破解Web应用程序,使其不像Web应用程序那样行事。将这些技术用于适当的目的。