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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам