Global.asax Session_Start() бесконечный цикл

В моем файле Global.asax у меня есть следующий код, который обрабатывает необработанные исключения:

void Application_Error(object sender, EventArgs e)
{
    Application["Exception"] = Server.GetLastError();
    Response.Redirect("ErrorPage.aspx");
}

(ErrorPage.aspx извлекает сведения об исключении из приложения и обрабатывает его.)

По-прежнему в Global.asax я запускаю следующий код, чтобы проверить все, что связано с пользователем:

void Session_Start(object sender, EventArgs e)
{
    ... // All sorts of user-related stuff
}

Обычно и перенаправление ошибок, и все, что связано с пользователем, работает отлично.

Однако, если во время Session_Start возникает ошибка, страница перенаправляется, и Session_Start вызывается снова!

Это приводит к бесконечному циклу.

Из того, что я нашел здесь и здесь, это происходит из-за какого-то сессионные файлы cookie, из-за чего браузер и/или сервер считают, что сеанс перезапускается при каждом перенаправлении.

Кто-нибудь знает, как решить проблему с куки?


person Yehuda Shapira    schedule 11.10.2011    source источник


Ответы (2)


Я бы установил флаг в Session_Start, говорящий «не перенаправлять при возникновении ошибки», например:

void Session_Start(object sender, EventArgs e)
{
    Application["DoNotRedirectOnError"] = true
    ... // All sorts of user-related stuff
    Application["DoNotRedirectOnError"] = false
}

Затем в обработке ошибок проверьте этот флаг и используйте вместо него Server.Execute:

void Application_Error(object sender, EventArgs e)
{
    Application["Exception"] = Server.GetLastError();
    if (Application["DoNotRedirectOnError"] != null && (bool)Application["DoNotRedirectOnError"] == true)
    {
        Server.Execute("ErrorPage.aspx");
        Application["DoNotRedirectOnError"] = false;
    }
    else
    {
        Response.Redirect("ErrorPage.aspx");
    }
}

Это по-прежнему будет выполнять страницу за кулисами (регистрируя ошибку и т. д.), но не должно снова вызывать запуск сеанса.

person Shadow Wizard Wearing Mask V2    schedule 11.10.2011

сохраните логику внутри Session_Start как можно более простой и поставьте try catch, чтобы все исключения оттуда были обработаны. Используйте ведение журнала для регистрации того, что происходит в таком блоке catch в случае, если поток управления попадает в блок catch (ну, вы все равно должны регистрировать исключения в любом отдельном блоке catch вашего приложения... :) ), но не перебрасывать что-либо из Session_Start.

person Davide Piras    schedule 11.10.2011