HttpContext.current.Session очищается на странице ошибки

Я создал специальную страницу ошибки для своего приложения ASP.NET 4. Я помещаю объект исключения в HttpContext.current.Session["CustomError"], но когда пользователь перенаправляется на страницу с ошибкой, HttpContext.current.Session["CustomError"] имеет значение null. Я делаю это в конструкторе класса CustomError вот так:

public CustomError(enExceptionType ExceptionType) : base(ExceptionMessage(ExceptionType)) { 
    HttpContext.Current.Session["CustomError"] = this; 
}

когда я перехожу через код Сессия ["Ошибка"] содержит объект ошибки. любая идея?

ОБНОВИТЬ:

Я удалил страницу пользовательской ошибки из web.config и добавил это в glabal.asax:

void Application_Error(object sender, EventArgs e)
{
    if (Context.IsCustomErrorEnabled)
    {
        Response.Redirect("~/Error.aspx");
    }
}

Пройдя через эту функцию, я заметил, что когда генерируется исключение, эта функция вызывается два раза, первый раз Session ["CustiomError"] содержит объект ошибки, а второй раз - null.


person nima    schedule 23.04.2011    source источник
comment
Чего вы хотите достичь с помощью настраиваемого сеанса ошибок? Если вы хотите зарегистрировать его, вы можете использовать событие application_error в глобальном asax   -  person Ivo    schedule 23.04.2011
comment
Я хочу отобразить сообщение об ошибке настраиваемого объекта ошибки на странице ошибки.   -  person nima    schedule 23.04.2011
comment
Можете поставить код там, где назначаете исключение?   -  person Cristian Boariu    schedule 23.04.2011
comment
Я обновил пост и добавил код   -  person nima    schedule 23.04.2011
comment
@nima Вы уверены, что перенаправление выполняется ПОСЛЕ того, как вы вводите значение исключения?   -  person Cristian Boariu    schedule 23.04.2011
comment
У меня есть точка останова в строке, которая устанавливает сеанс, и одна на загрузке страницы с ошибкой, и они находятся в правильном порядке. Это не только объект исключения, который удаляется из сеанса, все объекты в сеансе имеют значение NULL на странице ошибки.   -  person nima    schedule 23.04.2011


Ответы (2)


Вместо использования Response.redirect(URL) (который, я полагаю, у вас есть в вашем коде) используйте

Server.Transfer(URL)

or

Response.redirect(url, false)

Почему Server.Transfer(url)?

Переход на другую страницу с помощью Server.Transfer экономит ресурсы сервера. Вместо того, чтобы сообщать браузеру о перенаправлении, он просто меняет «фокус» на веб-сервере и передает запрос. Это означает, что вы не получаете столько HTTP-запросов, что снижает нагрузку на ваш веб-сервер и заставляет ваши приложения работать быстрее.

Источник здесь.

Пожалуйста, дайте мне знать, подходит ли вам один из них.

ОБНОВЛЕНИЕ:

Если вы используете настройку веб-конфигурации, можете ли вы попробовать добавить значение ResponseWrite в переменную redirectmode?

<customErrors mode="RemoteOnly" defaultRedirect="~/errors/GeneralError.aspx" redirectMode="ResponseRewrite" />

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

person Cristian Boariu    schedule 23.04.2011
comment
Я не использую Response.Redirect. Я определил настраиваемую страницу ошибок в web.config, и пользователь автоматически перенаправляется на страницу ошибки при исключении. - person nima; 23.04.2011
comment
Когда я добавляю ResponseRewrite, когда я хочу получить доступ к сеансу на странице ошибки, возникает исключение: состояние сеанса можно использовать только тогда, когда для параметра enableSessionState установлено значение true, либо в файле конфигурации, либо в директиве Page. Также убедитесь, что System.Web.SessionStateModule или настраиваемый модуль состояния сеанса включен в раздел ‹configuration› \ ‹system.web› \ ‹httpModules› в конфигурации приложения. - person nima; 23.04.2011
comment
@nima Если у вас есть это: <pages enableSessionState="true" /> в вашем web.config, у вас не должно быть такой проблемы. (источник ) - person Cristian Boariu; 23.04.2011
comment
У меня есть enableSessionState = true в web.config и на самой странице ошибки, но когда я добавляю redirectMode = ResponseRewrite, возникает исключение. - person nima; 23.04.2011
comment
@nima Это решение работает с вашей последней ошибкой? stackoverflow.com/questions/781861/ - person Cristian Boariu; 23.04.2011
comment
Нет, это не проблема. Моя настраиваемая страница ошибок загружается всякий раз, когда возникает исключение. - person nima; 23.04.2011
comment
@nima А теперь, если вы используете Server.Transfer, как я в посте поставил? - person Cristian Boariu; 23.04.2011
comment
Если я использую Server.Transfer вместо Response.Redirect, я не могу получить доступ к сеансу на странице ошибки. - person nima; 23.04.2011

Это решило проблему, но я был бы признателен, если бы кто-нибудь сказал мне, почему :)

void Application_Error(object sender, EventArgs e)
{
    if (Context.IsCustomErrorEnabled)
    {
        Response.Redirect("~/Error.aspx");
        **Server.ClearError();**
    }
}
person nima    schedule 23.04.2011