2016-08-14 56 views
2

我有一種情況,突然我的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); 

回答

0

也許你的例子中缺少一些代碼。您可能會在不同的線程上調用 UserManager.Create(),可能位於App.Startup, ,其中HttpContext不存在。 (因爲它只存在於服務器 - 客戶端之間的會話中)。