Web API仅允许单个异步任务

Vla*_*irs 3 c# asp.net asynchronous async-await asp.net-web-api

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

请记住:

[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)
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ary 6

async不会改变HTTP协议(正如我在我的博客上解释的那样).所以你仍然只是每个请求得到一个响应.

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

ImportConfigurationData然后,该操作将检查该数据是否已存在令牌,并在找到时对该请求进行故障.