我想在我的asp.net应用程序中访问HttpContext.Current
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
我该如何解决这个错误?
我想在我的asp.net应用程序中访问HttpContext.Current
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
我该如何解决这个错误?
Task.Factory.Start
会启动一个新的Thread
,因为HttpContext.Context
是本地线程的,所以它不会自动复制到新的Thread
中,因此你需要手动传递:
var task = Task.Factory.StartNew(
state =>
{
var context = (HttpContext) state;
//use context
},
HttpContext.Current);
var currentContext = HttpContext.Current;
Task.Factory.Start(() => {
// currentContext is not null here
});
请记住,一个任务的生命周期可能会超过HTTP请求的生命周期,在请求完成后访问HTTPContext可能会导致有趣的结果。
正如David所指出的那样,HttpContext.Current并不总是有效。在我的情况下,大约有20分之1的时间,CurrentContext将为null。最终结果如下。
string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
UserName ...
}
context.Items[x]
这样的东西不包含之前放置的内容。另请参见https://dev59.com/r2ox5IYBdhLWcg3w3X9S。 - Rory