HttpContextBase: сеанс нулевой

Я использую 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
вараппа


person David Rettenbacher    schedule 23.05.2011    source источник
comment
Можете ли вы определить очень высокую скорость запросов? Можете ли вы опубликовать неудачный тест? Вы пытались сделать его временным вместо PerWebRequest?   -  person Mauricio Scheffer    schedule 23.05.2011
comment
Очень высокий уровень запросов: ImageController должен обслуживать ~25 изображений. Каждый раз, когда делается запрос к какому-либо контроллеру (так же как и этот), принципал создается и сохраняется в сеансе (через HttpSessionStorage). Как уже говорилось, иногда сохранение не удается, потому что сеанс в сеансе в обертке равен нулю.   -  person David Rettenbacher    schedule 23.05.2011


Ответы (2)


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

person Igor Brejc    schedule 23.05.2011

Хорошо, это было не из-за неправильной регистрации в замке Виндзор, а из-за чего-то более простого: я получил доступ к сеансу в то время, когда он не был гарантированно полностью инициализирован - подставь меня!

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

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

person David Rettenbacher    schedule 23.05.2011