我正在使用“Web Api 休息服务的 Postasync 方法:
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;
}
经过这次修复后,我们注意到性能得到了改善,
但我们发现了另一个批评者的问题:
当访问时HttpContext.Current- 它返回空引用:
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.为什么在最后一个例子中,设置“HttpContext.Current”在等待任务中,
导致请求返回相同的不良性能结果,类似于同步结果?
2.我们还有其他方法可以使用吗“HttpContext.Current”在调用“ExecuteServerLogics”的内部任务内,
以及所有也调用的静态类“HttpContext.Current”?
我整个设计是不是错了?
Thanks!