我有以下 mvc 动作。
public async Task<JsonResult> DoSomeLongRunningOperation()
{
return await Task.Run(() =>
{
//Do a lot of long running stuff
//The underlying framework uses the HttpContext.Current.User.Identity.Name so the user is passed on the messagebus.
}
}
在任务中,HttpContext 为空。我们做了很多欺骗,但没有任何东西可以保证 HttpContext 在我们的新线程中始终可用。
是否有在异步任务中使用 HttpContext 的解决方案?
在我们的 IocContainer 中,我们注册了以下将用户名传递给框架的对象。
public class HttpContextUserIdentityName : ICredentials
{
public string Name
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
在持久化到数据库之前,很多地方都会调用此代码。
我们需要另一种方法来获取发起 web 请求的用户的用户名,或者解决 HttpContext 为空的问题。
因为持久化到数据库发生在任务中,所以在进入任务之前我无法访问 HttpContext。
我也想不出一种安全的方法来临时保留用户名,这样我就可以实现另一个 ICredentials 服务对象。