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内容完成.
async不会改变HTTP协议(正如我在我的博客上解释的那样).所以你仍然只是每个请求得到一个响应.
正确的解决方案是在一些可靠的存储(例如,Azure表/队列)中保存工作的"令牌"(和导入数据),并具有执行实际导入的单独处理后端.
ImportConfigurationData然后,该操作将检查该数据是否已存在令牌,并在找到时对该请求进行故障.
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |