HttpContext.Current.Session имеет значение null при маршрутизации запросов

Без маршрутизации HttpContext.Current.Session есть, поэтому я знаю, что StateServer работает. Когда я маршрутизирую свои запросы, HttpContext.Current.Session - это null на маршрутизируемой странице. Я использую .NET 3.5 sp1 в IIS 7.0 без предварительных просмотров MVC. Похоже, что AcquireRequestState никогда не запускается при использовании маршрутов, поэтому переменная сеанса не создается / не заполняется.

Когда я пытаюсь получить доступ к переменным сеанса, я получаю эту ошибку:

base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>.

Во время отладки я также получаю сообщение об ошибке, что HttpContext.Current.Session недоступен в этом контексте.

-

Мой web.config выглядит так:

<configuration>
  ...
  <system.web>
    <pages enableSessionState = "true">
      <controls>
        ...
      </controls>
    </pages>
    ...
  </system.web>
  <sessionState cookieless = "AutoDetect" mode = "StateServer" timeout = "22" />
  ...
</configuration>

Вот реализация IRouteHandler:

public class WebPageRouteHandler : IRouteHandler, IRequiresSessionState
{
    public string m_VirtualPath { get; private set; }
    public bool m_CheckPhysicalUrlAccess { get; set; }

    public WebPageRouteHandler(string virtualPath) : this(virtualPath, false)
    {
    }
    public WebPageRouteHandler(string virtualPath, bool checkPhysicalUrlAccess)
    {
        m_VirtualPath = virtualPath;
        m_CheckPhysicalUrlAccess = checkPhysicalUrlAccess;
    }

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        if (m_CheckPhysicalUrlAccess
            && !UrlAuthorizationModule.CheckUrlAccessForPrincipal(
                   m_VirtualPath,
                   requestContext.HttpContext.User,
                   requestContext.HttpContext.Request.HttpMethod))
        {
            throw new SecurityException();
        }

        string var = String.Empty;
        foreach (var value in requestContext.RouteData.Values)
        {
            requestContext.HttpContext.Items[value.Key] = value.Value;
        }

        Page page = BuildManager.CreateInstanceFromVirtualPath(
                        m_VirtualPath, 
                        typeof(Page)) as Page;// IHttpHandler;

        if (page != null)
        {
            return page;
        }
        return page;
    }
}

Я также пытался разместить EnableSessionState = "True" в верхней части страниц aspx, но все равно ничего.

Есть идеи? Стоит ли писать другой HttpRequestHandler, реализующий IRequiresSessionState?

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
48
0
114 692
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Похоже, вы забыли добавить адрес своего государственного сервера в файл config.

 <sessionstate mode = "StateServer" timeout = "20" server = "127.0.0.1" port = "42424" />

Пробовал но все равно. На самом деле это не имеет значения с его значением по умолчанию: "tcpip = loopback: 42424" (msdn.microsoft.com/en-us/librar‌ и /…) Я сомневаюсь, что проблема в провайдере сеанса, поскольку он работает без маршрутизации.

Loki 20.10.2008 15:32

Раздел конфигурации кажется нормальным, поскольку он работает, если при обычном доступе к страницам. Я пробовал другие предложенные конфигурации, но проблема все еще существует.

Я сомневаюсь, что проблема в провайдере сеанса, поскольку он работает без маршрутизации.

Что сказал @ Богдан Максим. Или перейдите на InProc, если вы не используете внешний сервер состояния сеанса.

<sessionState mode = "InProc" timeout = "20" cookieless = "AutoDetect" />

Посмотрите здесь для получения дополнительной информации о директиве SessionState.

SessionState работает, если я обычно открываю страницу. Если я использую маршрутизацию, HttpContext.Current.Session имеет значение null. Раздел <sessionState>, похоже, работает в конфигурации.

Loki 20.10.2008 15:41

Я думаю, что эта часть кода вносит изменения в контекст.

 Page page = BuildManager.CreateInstanceFromVirtualPath(
                        m_VirtualPath, 
                        typeof(Page)) as Page;// IHttpHandler;

Также эта часть кода бесполезна:

 if (page != null)
 {
     return page;
 }
 return page;

Он всегда будет возвращать страницу, независимо от того, является ли она нулевой или нет.

Спасибо за напоминание. Это был какой-то рудиментарный код после стольких попыток. : D

Loki 21.10.2008 13:03
Ответ принят как подходящий

Понятно. На самом деле, довольно глупо. Это сработало после того, как я удалил и добавил SessionStateModule следующим образом:

<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name = "Session" />
      <add name = "Session" type = "System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

Простое добавление этого не сработает, поскольку "Сессия" уже должна быть определена в machine.config.

Теперь мне интересно, обычно ли это так. Конечно, это не так, потому что кажется таким грубым ...

Спасибо за это. Он прекрасно решил мою проблему - как оказалось, он был нужен производственному серверу, но не машине разработчика.

Raithlin 03.02.2010 10:42

Это инс @ ne! Спасибо. Это исправило исчезновение моих значений "TempData" (mvc razor) (поскольку TempData использует сеанс). Holy Moly.

granadaCoder 10.08.2015 23:44

У меня проблема с исчезновением значений TempData, но это не решило ее.

Dinei 27.08.2015 22:54

Только что исправил мою проблему с TempData. Мне пришлось изменить sessionState в web.config, чтобы использовать StateServer вместо InProc по умолчанию.

Dinei 28.08.2015 00:10

Хорошая работа! У меня была такая же проблема. Добавление и удаление модуля Session у меня тоже отлично сработало. Однако он не вернулся с помощью HttpContext.Current.User, поэтому я попробовал ваш маленький трюк с модулем FormsAuth, и, конечно же, он сделал это.

<remove name = "FormsAuthentication" />
<add name = "FormsAuthentication" type = "System.Web.Security.FormsAuthenticationModule"/>

Просто добавьте атрибут runAllManagedModulesForAllRequests = "true" к system.webServer\modules в web.config.

Этот атрибут включен по умолчанию в проектах MVC и Dynamic Data.

Потрясающий! это ответ, который я получил .. намного лучше, чем принятый.

Pure.Krome 20.05.2010 08:41

Прочтите какой-нибудь шансельман, чтобы узнать, почему раммфар может быть плохим для вашего (сервера) здоровья: hanselman.com/blog/…

Peter 13.04.2012 10:30

лучшее решение

runAllManagedModulesForAllRequest - это умная вещь, позволяющая удалить и повторно вставить модуль сеанса.

алк.

Пожалуйста, прочтите это, чтобы понять, почему это не умное решение: hanselman.com/blog/…

Fabricio 19.11.2020 22:06

runAllManagedModulesForAllRequests=true - действительно плохое решение. Это увеличило время загрузки моего приложения на 200%. Лучшее решение - вручную удалить и добавить объект сеанса и избежать одновременного выполнения всех атрибутов управляемых модулей.

Мне не хватало ссылки на dll System.web.mvc в адаптере сеанса, и добавление того же исправило проблему.

Надеюсь, это поможет кому-то другому пройти по тому же сценарию.

Что это значит? Что для этого нужно сделать?

paulwhit 16.10.2014 06:30

Извините, я не понял ваш вопрос. О каких шагах вы говорите? Я добавил ссылку на "System.web.mvc dll", щелкнув правой кнопкой мыши ссылки на проект mvc внутри Visual Studio.

Mandeep Janjua 19.10.2014 04:19

Ни одно из этих решений не помогло мне. Я добавил следующий метод в global.asax.cs, тогда сеанс не был нулевым:

protected void Application_PostAuthorizeRequest()
{
    HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}

И почему это помогает? : ^)

user2173353 05.07.2019 12:24

@ user2173353 Мне это помогло, потому что я пытался получить доступ к SessionState в объекте во время запроса web.api. Я предполагаю, что раньше это не работало, потому что SessionState не был включен в HttpContext этого конкретного типа запроса.

jaybro 16.12.2020 19:35

@jaybro Да, теперь я тоже это знаю, после некоторого расследования, которое я провел. У WebAPI состояние сеанса по умолчанию отключено, и вам нужно включить его самостоятельно, если вы хотите его использовать. Однако, если вы не используете его как ReadOnly, пользовательские запросы не будут выполняться параллельно, потому что каждый запрос одного и того же пользователя блокирует словарь состояния сеанса, чтобы предотвратить состояние гонки. Я пробовал использовать разные SessionStateBehavior для каждой конечной точки, чтобы использовать Required только при необходимости, но структура сработала против меня.

user2173353 17.12.2020 16:03

Другие вопросы по теме