HttpContextBase:Session为null

时间:2011-05-23 08:17:14

标签: session castle-windsor httpcontext

我使用Windor Castle通过工厂方法 HttpContext 包装到 HttpContextWrapper

container.Register(
    Component.For<HttpContextBase>()
        .LifeStyle.PerWebRequest
        .UsingFactoryMethod(() => new HttpContextWrapper(HttpContext.Current)));

我有一个名为SessionStorage的班级,可以访问HttpContext.Current.Session。我这样注册:

container.Register(
    Component.For<ISessionStorage>()
    .LifeStyle.PerWebRequest
    .ImplementedBy<HttpSessionStorage>());

HttpSessionStorage类:

public class HttpSessionStorage : ISessionStorage
{
    public HttpContextBase httpContext { get; set; }

    public void Remove(string key)
    {
        httpContext.Session.Remove(key);        
    }

    public T Get<T>(string key)
    {
        return (T)httpContext.Session[key];
    }

    public void Set<T>(string key, T value)
    {
        httpContext.Session[key] = value;
    }
}

当我以这种方式使用它时,然后在约40%的情况下, Session属性为空且仅 < / em> 如果请求的费率非常高

奇怪的是,如果我使用HttpContext.Current 而不是 httpContext,那么它适用于所有情况。

public class HttpSessionStorage : ISessionStorage
{
    public HttpContextBase httpContext { get; set; }

    public void Remove(string key)
    {
        HttpContext.Current.Session.Remove(key);        
    }

    public T Get<T>(string key)
    {
        return (T)HttpContext.Current.Session[key];
    }

    public void Set<T>(string key, T value)
    {
        HttpContext.Current.Session[key] = value;
    }
}

这与温莎城堡有关,但我找不到问题。我将所有可能的内容注册为PerWebRequest(NHibernate会话工厂除外)。

有人知道我还能检查什么吗?

LG
warappa

2 个答案:

答案 0 :(得分:0)

我有一段时间遇到过类似的问题,也许我的问题的答案可以帮到你:ASP.NET MVC & Windsor.Castle: working with HttpContext-dependent services

答案 1 :(得分:0)

好吧,这不是因为没有合适的Castle Windsor注册,而是更简单:我访问会话,当时无法保证完全初始化 - 假我!

我的解决方案是将会话访问代码从Application_BeginRequest移至Application_AcquireRequestState pointed out here

注意:
也许这段代码应该移到基本控制器中 - 在OnAuthorization中(编辑:它可以工作!)。