我有一種情況,突然我的HttpContext通過類庫訪問它時爲null。作爲幫助程序的類庫包含一種讀取信息並將其返回的方法。HttpContext null,codepath需要不同的線程
深入挖掘後,我發現代碼正在另一個線程上執行,我假設HttpContext綁定到特定的線程。在控制器中,HttpContext是可用的,但是當我從類庫訪問HttpContext時,它變成了null,並且出現在另一個線程中。
我真的想知道爲什麼會發生這種情況/我如何找到這種行爲的根源?
當我在GetTenantSession()上放置一個調試點時,發生UserManager.Find執行的那一刻,我可以看到線程已更改,並且HttpContext爲空。
我的控制器(帶T,A,B,C用於調試)
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Index(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
return View(model);
var t = Thread.CurrentThread.ManagedThreadId;
var a = (IDocumentSession)HttpContext.Items["RavenDB_TenantSession"];
var b = (IDocumentSession)System.Web.HttpContext.Current.Items["RavenDB_TenantSession"];
var c = RavenContext.GetTenantSession();
var user = UserManager.Find(model.Email, model.Password);
return View();
}
RavenContext.cs(類庫)
public class RavenContext
{
public static IDocumentSession GetMasterSession()
{
return (IDocumentSession)HttpContext.Current.Items["RavenDB_MasterSession"];
}
public static IDocumentSession GetTenantSession()
{
var t = Thread.CurrentThread.ManagedThreadId;
return (IDocumentSession)HttpContext.Current.Items["RavenDB_TenantSession"];
}
public static void InitTenantSession(string tenantDBName)
{
HttpContext.Current.Items["RavenDB_TenantSession"] = GetDocumentStore().OpenSession(tenantDBName);
}
public static IDocumentStore GetDocumentStore()
{
return (IDocumentStore)HttpContext.Current.Items["RavenDB_DocumentStore"];
}
}
的UserManager,引用RavenContext.GetTenantSession
public class UserManager : UserManager<User>
{
public UserManager(IUserStore<User> store) : base(store){}
public static UserManager Create(IdentityFactoryOptions<UserManager> options, IOwinContext context)
{
var userStore = new UserStore<User>(RavenContext.GetTenantSession);