Почему ASP.NET получает доступ к State Server, даже если для страницы EnableSessionState = "False", но только для сайта VB.NET, а не сайта C #? - PullRequest
7 голосов
/ 06 октября 2011

Наш веб-сайт использует наше собственное управление состоянием сеанса отдельно от состояния сеанса ASP.NET. Но поскольку несколько специальных страниц используют службы отчетов SQL Server, нам также необходимо включить состояние сеанса ASP.NET. Поскольку мы находимся в среде с балансировкой нагрузки, мы включили ASP.NET State Server (aspnet_state.exe или «Режим вне процесса») на отдельном бэкэнд-компьютере.

Сегодня я заметил, что когда мы временно отключили машину, на которой запущена служба состояний в нашей среде Dev, веб-сайт Dev перестал работать («Невозможно отправить запрос состояния сеанса на сервер состояния сеанса».) Это несмотря на наличие EnableSessionState = «Ложь» на загружаемой странице.

Зачем ASP.NET необходимо подключаться к службе состояний при обработке запроса на страницу, которая не использует состояние сеанса? Похоже, это происходит, даже если страница не использует мастер-страницу, базовую страницу или какие-либо пользовательские элементы управления. Я проверил весь наш программный код, чтобы убедиться, что мы никогда не будем программно повторно включать состояние сеанса или пытаться получить к нему доступ.

--- РЕДАКТИРОВАТЬ ПОСЛЕ БОЛЬШЕ НЕИСПРАВНОСТЕЙ ---

Как предложено пользователем ниже, я попытался создать веб-сайт с нуля, чтобы протестировать его без каких-либо осложнений со стороны httpHandlers, httpModules или другой пользовательской логики.

  1. Я использовал Visual Studio 2008 для создания нового «Веб-сайта ASP.NET» с использованием VB.NET .
  2. Я запустил сайт через VS, что позволило ему включить режим отладки и создать стандартный файл web.config.
  3. Я добавил <sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" /> в элемент <system.web> и запустил локальную службу состояний ASP.NET ".
  4. Я изменил EnableSessionState страницы Default.aspx на False и перезагрузил страницу = OK.
  5. Я остановил службу состояний ASP.NET и перезагрузил страницу = "Невозможно сделать запрос состояния сеанса на сервер состояния сеанса."

В этот момент я был озадачен, потому что другие пользователи утверждали, что они пробовали что-то подобное и не испытывали такой же проблемы. Поэтому мне стало интересно, имеет ли это какое-либо отношение к использованию VB.NET (хотя это звучит глупо). Все больше людей используют C # для ASP.NET, поэтому Я переделал свой тест выше с веб-сайта C #, и вот, нет исключений при доступе к странице! Я получил исключение, только если я установил EnableSessionState в True и фактически получил доступ к коллекции сеансов в коде.

Это доказывает, что сайты VB.NET в ASP.NET ведут себя немного по-другому, так как они обращаются к состоянию сеанса на каждой странице, даже если страница не нужна. К сожалению, это не отвечает на мой первоначальный вопрос: Почему?

Я собираюсь сделать кросс-пост на официальных форумах ASP.NET и посмотреть, смогут ли какие-нибудь гуру там пролить свет.

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

Ищите любые HttpHandlers или HttpModules в вашем веб-приложении.Вполне возможно, что они требуют состояния сеанса, даже если ваши страницы нет.

1 голос
/ 12 октября 2011

Вы что-то упустили. Потому что в ASP.NET Web Forms по умолчанию обработчик страницы (класс Page) не реализует интерфейс «IRequiresSessionState» по умолчанию. Я попробовал ваш случай с большим сайтом ASP.NET:

  1. Сеанс был включен в web.config (режим StateServer), в то время как EnableSessionState страницы был отключен - запросы к default.aspx были успешно обработаны с отключением StateServer.
  2. После включения EnableSessionState страницы - она ​​начала выдавать исключения, подобные вашей.

Вы можете легко повторить тот же эксперимент.

0 голосов
/ 30 октября 2011

Каждый запрос страницы попадает в базовый поставщик сеанса, чтобы пометить хранилище времени доступа к сеансу, чтобы сеанс не был очищен случайно. Предыдущее состояние истинно независимо от значения EnableSessionState и независимо от режима состояния сеанса (InProc, StateServer, ....).

0 голосов
/ 14 октября 2011

Извините, это может показаться очевидным, но вы проверили Global.asax?

...