HttpContext为null,codepath采用不同的线程

时间:2016-08-14 14:09:20

标签: c# asp.net asp.net-mvc httpcontext

我有一种情况,当通过类库访问它时,我的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);

1 个答案:

答案 0 :(得分:0)

您的示例中可能缺少某些代码。你可能会打电话 UserManager.Create()在另一个线程上,可能在App.Startup上, 其中HttpContext不存在。 (因为它只存在于服务器 - 客户端之间的会话中)。