我有一种情况,当通过类库访问它时,我的HttpContext突然变为null。作为帮助程序的类库包含一个读取信息并将其返回的方法。
在深入挖掘之后,我发现代码正在另一个线程上执行,我认为HttpContext绑定到一个特定的线程。在控制器中,HttpContext是可用的,但是当我从类库访问HttpContext时,它变为null并且在另一个线程中。
我真的想知道为什么会发生这种情况/我如何找到这种行为的根本原因?
当我在GetTenantSession()上放置一个调试点时,就会在执行UserManager.Find时发生,我可以看到线程已经改变,并且HttpContext为null。
我的控制器(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 :(得分:0)
您的示例中可能缺少某些代码。你可能会打电话
UserManager.Create()
在另一个线程上,可能在App.Startup上,
其中HttpContext不存在。
(因为它只存在于服务器 - 客户端之间的会话中)。