Почему 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, чтобы вытащить ошибку из контекста и отобразить сообщение.