Почему HttpContext.Session имеет значение null, когда redirectMode = ResponseRewrite

Как предлагается в другом месте, я Я использую redirectMode = ResponseRewrite в моей настраиваемой конфигурации ошибок, чтобы моя настраиваемая страница ошибок могла получить доступ к информации об исключении. Некоторое время это работало как чары.

При добавлении некоторых дополнительных функций типа «помочь пользователю восстановиться после ошибки» нам понадобится часть информации, которая ранее хранилась в Session. При реализации этого я обнаружил, что различные пути к сеансу заканчиваются нулевым значением, когда redirectMode = ResponseRewrite, но все они заполняются, когда redirectMode = ResponseRedirect (или не определен).

Кто-нибудь знает почему? Кажется странным, что нам пришлось бы выбирать между наличием информации об исключении (ResponseRewrite) или наличием сеанса (ResponseRedirect).

В статье MSDN о расширенной настраиваемой обработке ошибок говорится, что сеанс только доступен, когда метод передачи управления - Server.Transfer, что я предполагал, что ResponseRewrite используется под капотом. Очевидно, это не так.


person Josh    schedule 19.10.2009    source источник
comment
+1 У меня точно такая же проблема   -  person Mauricio Scheffer    schedule 04.11.2009
comment
Маурисио, я еще не знаю ответа на вопрос, но чтобы обойти его, я взял атрибут redirectMode из своей веб-конфигурации и поместил настраиваемую логику в обработчик Global.asax Application_Error, чтобы делать то, что я хотел. Я заменяю исключение на удобное для пользователя исключение сообщения, но по сути логика передачи такова: if (Context.IsCustomErrorEnabled) {Server.Transfer (~ / Error.aspx); } Затем на странице Error.aspx есть код Page_Load, чтобы вытащить ошибку из контекста и отобразить сообщение.   -  person Josh    schedule 04.11.2009
comment
@ Джош, это выглядит хорошо, вставьте его в ответ, чтобы я мог правильно проголосовать за него :-)   -  person Mauricio Scheffer    schedule 04.11.2009


Ответы (1)


Я пока не знаю ответа на вопрос, но чтобы обойти его, я взял атрибут redirectMode из своей веб-конфигурации и поместил настраиваемую логику в обработчик Global.asax Application_Error, чтобы делать то, что я хотел. Я заменяю исключение "удобным для пользователя" исключением сообщения, но, по сути, логика передачи такова:

if(Context.IsCustomErrorEnabled)
{
Server.Transfer("~/Error.aspx");
}

Затем на странице Error.aspx есть код Page_Load, чтобы вытащить ошибку из контекста и отобразить сообщение.

person Josh    schedule 09.11.2009