Что на самом деле вызывает Session_Start для вызова? - PullRequest
9 голосов
/ 22 марта 2009

В небольшом демонстрационном приложении, которое я создаю, я поместил код для инициализации базы данных в событии Global.Session_Start (). Однако я заметил, что это событие не срабатывает, когда я запускаю приложение в отладчике на сервере разработки (еще нигде не тестировал).

Вопрос 1: Что дает? Когда Session_Start () действительно вызывается? Я предполагаю, что это когда сеанс начинается, но разве начало каждой новой последовательности запросов не должно вызывать автоматический запуск сеанса? Конечно, сеанс должен начинаться всякий раз, когда я запускаю с F5, так почему бы и нет.

Вопрос 2: Есть ли лучшее место, куда должен идти код для инициализации базы данных? я бы предпочел не помещать его в метод Application_Start, поскольку он не всегда вызывается при отладке.

PS. Под инициализацией базы данных я не имею в виду, что я открываю соединение с SqlServer и оставляю его открытым навсегда. Я использую db4o и открываю предварительно созданный файл базы данных. Как я уже говорил, это просто демонстрационное приложение, меня не беспокоит плохое управление ресурсами или что-то в этом роде.

Ответы [ 4 ]

7 голосов
/ 18 ноября 2012

Я знаю, что это старый пост, но, возможно, это кому-нибудь поможет:

Сеанс_старта не запускается, если вы фактически не читаете или не записываете в объект сеанса.

Если вы хотите использовать событие session_start, но вообще не нуждаетесь в хранилище сеансов, вы можете добавить в директиву page ваших целевых страниц следующее:

<%@ Page EnableSessionState="ReadOnly" %>

Это вызовет событие session_start без необходимости что-либо сохранять в объекте сеанса.

4 голосов
/ 22 марта 2009

Я не совсем уверен, что сессия "запускается", пока вы не получите доступ к объекту Session. В противном случае может показаться ненужными накладные расходы для запуска ненужного сеанса.

2 голосов
/ 22 марта 2009

Hmm..ok. Может быть, имеет смысл положить код в BeginRequest (), но есть есть способ поместить обработчик в EndRequest (), в котором я могу закрыть файл базы данных?

Проблема в том, что вы никогда не можете полагаться на эти события при запуске, потому что среда выполнения ASP.NET решает, будут ли они запущены или нет, потому что они могут даже не быть необходимыми и могут быть пропущены для экономии ресурсов.

Например, Response.Redirect отменяет всю обработку запроса с использованием ThreadAbortException, а события жизненного цикла страницы / элемента управления после этого вообще не будут запускаться, поэтому, например, отсутствует End_Request или что-то подобное.

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

Не уверен, что именно эту информацию вы искали:)

1 голос
/ 22 марта 2009

Какую модель сеанса вы используете? В случае сессий, поддерживаемых SQL Server, он может не начинать новые сеансы. В случае InProc, я думаю, это должно работать. Как вы указали, Application_Start иногда вызывает срабатывание до того, как отладчик сможет подключиться.

Используете ли вы IIS или веб-сервер разработки? В случае IIS эта статья предполагает, что вам нужно сначала создать его как приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...