次の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がnullになります。私たちは多くのトリックを行いましたが、HttpContextが新しいスレッドで常に利用可能であることを保証するものは何もありません。
非同期タスク内でHttpContextを使用するためのソリューションはありますか?
IocContainerに、ユーザー名をフレームワークに渡す次のオブジェクトを登録しました。
public class HttpContextUserIdentityName : ICredentials
{
public string Name
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
このコードは、データベースに永続化する前に多くの場所で呼び出されます。
Webリクエストを開始したユーザーのユーザー名を取得する別の方法が必要であるか、HttpContextがnullである問題を修正する必要があります。
データベースへの永続化はタスクで発生するため、タスクに入る前にHttpContextにアクセスできません。
また、別のICredentialsサービスオブジェクトを実装できるように、ユーザー名を一時的に永続化する安全な方法を考えることもできません。