【发布时间】:2014-05-21 17:40:33
【问题描述】:
我正在使用 webApi 休息服务的“发布”异步方法:
public async Task<object> Post([FromBody]string data)
{
object response = ExecuteServerLogics(data);
return response;
}
上述代码运行良好,但在某些客户端调用中,我们遇到了性能问题。
在这里阅读了一些文章后,我注意到我们的 webApi 休息服务, 并没有真正与传入的 Web 请求异步工作, 因为我们忘了使用 async/await 模式:
public async Task<object> Post([FromBody]string data)
{
object response = await Task<object>.Run( () =>
{
return ExecuteServerLogics(data);
});
return response;
}
在这个修复之后,我们注意到性能变得更好了, 但我们发现了另一个批评者问题: 当访问 HttpContext.Current - 它返回 Null 引用:
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 引用到执行服务器逻辑的内部任务。 这个解决方案的问题是服务器的逻辑方法,使用许多静态类 “HttpContext.Current”如-
- 记录器调用。
- 检索 user.identity 的静态安全类
- 检索传入请求的会话数据等的静态安全类。
因此,传递工作线程的 "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", 并且在所有也调用 "HttpContext.Current" 的静态类中? 我在某种程度上做错了整个设计吗?
谢谢!
【问题讨论】:
标签: asp.net asynchronous asp.net-web-api async-await httpcontext