HttpContextBase: сеанс пуст - PullRequest
0 голосов
/ 23 мая 2011

Я использую 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 свойство имеет значение null и только , если запросы выполняются с очень высокой скоростью .

Странно то, что если я использую 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 голосов
/ 23 мая 2011

ОК, это было не из-за неподходящей регистрации в Castle Windsor, а из-за чего-то более простого: я получил доступ к сеансу в то время, когда не гарантированно полностью инициализирован - тупица!

Мое решение состояло в том, чтобы переместить код доступа к сеансу с Application_BeginRequest на Application_AcquireRequestState, как указано , указанное здесь .

Примечание:
Возможно, этот код следует переместитьв базовый контроллер - в OnAuthorization ( edit : все работает!).

0 голосов
/ 23 мая 2011

У меня были похожие проблемы некоторое время назад, возможно, ответы на мой вопрос могут вам помочь: ASP.NET MVC & Windsor.Castle: работа с HttpContext-зависимыми сервисами

...