Web API仅允许单个异步任务

时间:2014-02-10 14:59:26

标签: c# asp.net asynchronous asp.net-web-api async-await

仅处理单个异步操作的适当方案是什么?例如,我需要导入大文件,在导入时我需要禁用该选项以确保不会触发第二次导入。

请记住:

[HttpPost]
public async Task<HttpResponseMessage> ImportConfigurationData()
{
    if (HttpContext.Current.Application["ImportConfigurationDataInProcess"] as bool? ?? false)
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Task still running");

    HttpContext.Current.Application["ImportConfigurationDataInProcess"] = true;

    string root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);
    await Request.Content.ReadAsMultipartAsync(provider);

    //actual import

    HttpContext.Current.Application["ImportConfigurationDataInProcess"] = false;
    Request.CreateResponse(HttpStatusCode.OK, true)
}

但它似乎是非常硬编码的解决方案。什么是正确的处理方式? 另一件事在客户端不能正常工作仍然等待响应。因此,用户可以将该文件发送到服务器并且不等待它将完成,但是在文件发送到服务器之后重新加载页面而不等待await内容完成。

1 个答案:

答案 0 :(得分:6)

async does not change the HTTP protocol(正如我在博客中解释的那样)。所以你仍然只是每个请求得到一个回复​​。

正确的解决方案是在一些可靠的存储(例如,Azure表/队列)中保存工作的“令牌”(和导入数据),并具有执行实际导入的单独处理后端。

然后,ImportConfigurationData操作将检查该数据是否已存在令牌,如果找到,则检查该请求是否错误。