Почему ASP.NET доступ к серверу состояния, даже если страница EnableSessionState=»False», но только для VB.NET сайт, а не сайт на C #?

#.net #asp.net #vb.net #asp.net-3.5 #session-state

#.net #asp.net #vb.net #asp.net-3.5 #состояние сеанса

Вопрос:

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

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

Почему 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 форумы и посмотрите, могут ли какие-нибудь гуру там пролить какой-нибудь свет.

Комментарии:

1. Вы случайно используете SQL Server для состояния сеанса?

2. Нет, мы используем ASP.NET Сервер состояния (aspnet_state.exe ) работает на отдельном сервере. Но для EnableSessionState установлено значение False на всех страницах, кроме нескольких. Вопрос в том, почему ASP.NET вам нужен доступ к серверу состояния при обслуживании страниц, которые не используют состояние сеанса? Казалось бы, это без причины снижает производительность.

3. Вы когда-нибудь приходили к какому-либо решению по этому поводу?

4. @patmortech Нет, на самом деле это не то, что повредило нам в производстве, когда мы узнали, что нам нужно сохранить ASP.NET Государственная служба работает постоянно. В конце концов мы перестали использовать службу состояния, потому что поняли, что можем изменить настройку балансировщика нагрузки нашей веб-фермы с None на Affinity, что означает, что клиенты всегда будут обращаться к одному и тому же серверу в течение сеанса, поэтому обычный ASP. Состояние сеанса Net In-Proc было быстрее и проще.

Ответ №1:

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

Комментарии:

1. Хороший звонок. Я проверил, и у меня просто обычный ASP.NET Ajax-материал в HttpHandlers и HttpModules. Кроме того, у меня есть HttpHandler для SSRS под названием «ReportViewerWebControl» через Microsoft.Reporting. Веб-формы. HttpHandler. К сожалению, отключение всех этих обработчиков и перезапуск IIS не помогли. Я по-прежнему получаю то же самое «Невозможно отправить запрос состояния сеанса на сервер состояния сеанса». если я выключу ASP.NET Государственная служба. Я собираюсь попробовать воссоздать сайт с нуля, как предложил пукипуки ниже.

Ответ №2:

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

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

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

Комментарии:

1. Я, наконец, нашел время для повторного тестирования этого с пустым сайтом, и я действительно обнаружил то же поведение, что и в нашем основном проекте. Я обобщил свои шаги в редактировании исходного вопроса.

2. просто, похоже, команда vb реализовала интерфейс IRequiresSessionState ))

Ответ №3:

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

Комментарии:

1. Да, я проверил весь код, включая Global.asax.vb. Единственное событие приложения, которое переопределяется, — это Application_Error, и оно не использует состояние сеанса, оно просто перенаправляет на пользовательскую страницу ошибок.

Ответ №4:

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