仅处理单个异步操作的适当方案是什么?例如,我需要导入大文件,在导入时我需要禁用该选项以确保不会触发第二次导入。
请记住:
[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
内容完成。
答案 0 :(得分:6)
async
does not change the HTTP protocol(正如我在博客中解释的那样)。所以你仍然只是每个请求得到一个回复。
正确的解决方案是在一些可靠的存储(例如,Azure表/队列)中保存工作的“令牌”(和导入数据),并具有执行实际导入的单独处理后端。
然后,ImportConfigurationData
操作将检查该数据是否已存在令牌,如果找到,则检查该请求是否错误。