Имеется проблемка:
Делаю обработчик событий приложения. Начальство приказало убрать все из Global.asax в отдельный модуль. Делаю
public class ErrorModule : IHttpModule
{
public void Init(HttpApplication application)
{
application.Error += new EventHandler(application_Error);
}
public void application_Error(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
System.Web.SessionState.HttpSessionState Session = HttpContext.Current.Session;
Exception exception = app.Server.GetLastError();
if (null != exception)
{
Session[ErrorHelperStrings.BackUrl] = app.Request.UrlReferrer;
Session[ErrorHelperStrings.ErrorMessage] = exception.Message;
Session[ErrorHelperStrings.Exception] = exception;
}
app.Server.Transfer("~/ErrorPage.aspx");
}
После трансфера на страничку ошибки берем сохраненные данные из сессии и выдаем отчет. Самое веселое начинается потом. На той страничке есть кнопочка возврата на страницу, где произошла ошибка. Когда на нее нажимаем и смотрим дебаггер — сессия пуста. Если убрать app.Server.Transfer из вышеприведенного кода то вообще никакие данные до страницы ошибки не дойдут.
Но это еще не всё
Если где-нить на Default.aspx поставить строчку Session["tra-ta-ta"] = "qwe" и уже потом баловаться с обработкой ошибок — сессия при обновлении ErrorPage не стирается, т.е. все работает как задумывалось.
Вопрос: где зарыта собака?
RE: IHttpModule и Session
От:
Аноним
Дата:
03.07.07 14:02
Оценка:
См. интерфейс IRequiresSessionState
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
Возможно навру, т.к. точно не знаю просто есть идеи которые надо еще проверить.
1)Сессия скорее всего цепляется у тебя на основе сециальных кук. app.Server.Transfer — ты прерываешь выполнение текущего процеса и что у тебя происходит с сессионными куками непонятно. Отсюда и проблемы.
2)Dimon а IRequiresSessionState разве имеет отношение к модулю? на сколько я знаю это "метка" на хендлер.
Это все понятно, но делать-то что?
Смотрю в дебаггер: SessionId не меняется по ходу работы (мб он сохраняется где-то в кукисах), зато когда нажимаю кнопку возврата и начинаю смотреть отладчик, оказывается, что IsNewSession стоит в true. Т.е. после обработки ошибки и показа страницы сессия убивается
а на вопрос что делать — то попробуй писать в аппликешин. ключом можно взять случайное число или хеш исключения. на страницу с ошибкой редиректить с параметром значением этого ключа. На странице с ошибкой читать и удалять из аппликешина. только если будут ошибки на пути к странице ошибок апликешин забьется мусором.