【问题标题】:WebAPI: How can I push processing off so that the requester isn't hanging around for a response?WebAPI:我如何才能推迟处理,以便请求者不会等待响应?
【发布时间】:2016-10-19 18:38:31
【问题描述】:

我创建了一个 WebAPI 方法,它将从发布到该方法的内容中插入数据到数据库中。

我的问题是我如何才能推迟处理,以便请求者不会等待响应?

例如:

[HttpPost]
[Route("MyTest/ImportData")]
public HttpResponseMessage AddData([FromBody] XElement xmlBody)
{
    try
    {            
        // Verify that I can read the XML..

        // Push XML off to another process to insert into database.
        UpdateDataBase(xmlBody);

        // Notify requester that I accepted the file.
        return Request.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception ex)
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

我有什么作品。但是,插入所有数据最多可能需要 4 分钟。我想验证我是否可以读取 xml,以某种方式关闭进程并给用户一个 OK 响应。

【问题讨论】:

  • 另一种常见的做法是将您的数据发送到队列中,这样您的方法会很快返回,但监控队列的进程拥有它所需要的所有时间。
  • 注释您应该返回 HTTP 202 Accepted 状态代码,而不是 200 OK。 202 表示工作尚未完成,但已被接受在某个时间完成。

标签: c# asp.net-web-api


【解决方案1】:

将工作委托给其他进程。

它可以是你想要的任何东西,一个服务,一个命令行应用程序,任何合适的东西。

我会设置一个消息传递系统,让 webapi 将所有这些工作操作发送到一个队列,然后让一个 Windows 服务(例如处理这个队列)。这将释放 api 的压力,让它处理其他请求,而无需等待长时间运行的任务完成。没有比这更复杂的了。

作为一个建议,RabbitMQ 相当直接,但我建议你环顾四周,选择你喜欢的任何东西

【讨论】:

  • 什么类型的队列?
  • 在主要回复中添加了一条建议
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多