asp.net – Web API服务 – 如何在异步任务中使用“HttpContext.Current”
|
我正在使用webApi休息服务的“Post”异步方法: public async Task<object> Post([FromBody]string data)
{
object response = ExecuteServerLogics(data);
return response;
}
上面的代码工作得很好,但在一些客户的电话中,我们遇到了性能问题. 在这里阅读了一些文章后,我注意到我们的webApi休息服务, public async Task<object> Post([FromBody]string data)
{
object response = await Task<object>.Run( () =>
{
return ExecuteServerLogics(data);
});
return response;
}
在此修复后,我们注意到性能变得更好, public async Task<object> Post([FromBody]string data)
{
object response = await Task<object>.Run( () =>
{
var currentContext = HttpContext.Current; // Returns Null!
return ExecuteServerLogics(data);
});
return response;
}
我们试图找到一个解决方案,在大多数帖子中我们发现我们应该通过 >记录器调用. 因此,传递工作线程的“HttpContext.Current”引用将无法解决它. 当我们尝试下一个解决方案时: public async Task<object> Post([FromBody]string data)
{
// Save worker context:
var currentContext = HttpContext.Current;
object response = await Task<object>.Run( () =>
{
// Set the context of the current task :
HttpContext.Current = currentContext ; // Causes the calls not to work asynchronously for some reason!
// Executes logics for current request:
return ExecuteServerLogics(data);
});
return response;
}
出于某种原因,我们注意到性能再次恶化,就像它再次同步恢复工作一样. 我们的问题是: 1.为什么在最后一个例子中,在await任务中设置“HttpContext.Current”, 2.还有另一种方法我们可以在调用的内部任务中使用“HttpContext.Current” – “ExecuteServerLogics”, 谢谢! 解决方法从最开始:public async Task<object> Post([FromBody]string data)
{
object response = ExecuteServerLogics(data);
return response;
}
不要忽略编译器警告;编译器将为此方法生成警告,该警告明确指出它将同步运行. 继续:
对于单独的单个调用,服务器上的异步代码将不会更快.它只能帮助您扩展服务器. 特别是,Task.Run将否定异步的所有性能优势,然后将性能降低一点.我相信你所测量的性能改善是巧合的.
这些帖子是错误的.恕我直言.当该对象专门设计为仅从请求线程访问时,您最终会使用后台线程中的HttpContext对象.
我建议你退后一步,考虑一下大局.当请求进入时,它有一定的工作量.这项工作是同步还是异步完成对客户来说无关紧要;两种方法都需要大约相同的时间. 如果您需要尽早返回客户端,那么您将需要一个完全不同的架构.通常的方法是将工作排队到可靠的队列(例如,Azure队列),具有单独的后端(例如,Azure WebRole),并且在工作完成时主动通知客户端(例如,SignalR). 但这并不是说async是无用的.如果ExecuteServerLogics是一个I / O绑定方法,那么它应该是异步而不是阻塞,然后您可以使用异步方法: public async Task<object> Post([FromBody]string data)
{
object response = await ExecuteServerLogicsAsync(data);
return response;
}
这将使您的服务器整体上更具响应性和可扩展性(即,不会被许多请求所淹没). (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在ASP.NET MVC中获得HttpResponse的引用?
- 详细介绍有关于.NET的委托
- asp.net – 页面加载在Firefox上触发两次
- asp.net-mvc – ASP.net MVC CheckBoxFor转换错误
- asp.net – 获取连接到SignalR hub的客户端数量
- asp.net-mvc – 发送电子邮件是否属于应用程序的
- asp.net-mvc – 从业务逻辑类重定向asp.net mvc页
- asp.net – DotNetOpenAuth.WebServerClient.XSR
- asp.net – .Net的新文件?
- asp.net-mvc – 在ASP.NET MVC中下载动态生成的文
