内の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 ...
}