Предотвратить жизненный цикл страницы? - PullRequest
1 голос
/ 29 декабря 2011

У меня есть главная страница со ссылкой для выхода из системы. Когда пользователь нажимает на ссылку, я вызываю следующий метод:

    private void Logout()
    {
        SessionBll.DeleteSessionEntry(this.sessionId);
        FormsAuthentication.SignOut();
        Roles.DeleteCookie();
        LogHelper.Location = string.Empty;

        LogHelper.Info(logger, HttpContext.Current.User.Identity.Name, 
           MethodBase.GetCurrentMethod().Name, "User has been logged out from 
                Administrator.Master", LogMessage.LoggedOut);
        FormsAuthentication.RedirectToLoginPage();
    }

Теперь, когда пользователь находится на странице и щелкает ссылку, происходит нормальный цикл страницы, и вызывается этот метод.

Проблема в том, что пользователю не нужно ждать цикла страницы, его нужно перевести на страницу выхода из системы как можно быстрее (столько времени, сколько потребуется для выхода из системы). метод на сервере).

Как пропустить жизненный цикл страницы, но при этом вызывать этот метод?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 29 декабря 2011

Проблема в том, что пользователю не нужно ждать цикла страницы

Я бы сказал, что проблема в том, что страница, по-видимому, делает слишком много в цикле страниц. В WebForms, цикл страницы происходит. Это просто как это работает. Учти это ...

  • Чтобы взаимодействовать с выделенным кодом, клиентской форме нужно отправить POST на страницу.
  • Чтобы обработать POST, страница должна существовать в памяти.
  • Чтобы существовать, страница должна пройти стандартные этапы создания в своем жизненном цикле.

Не видя никакого реального кода, моя внутренняя реакция заключается в том, что вы слишком много делаете на Page_Load. Рефакторинг это. Делайте только то, что вам нужно, чтобы загрузить страницу . Не обрабатывать данные, не выполнять все виды серверной работы, просто загрузить страницу. Это должен быть довольно легкий процесс. Затем логически подключите необходимые фоновые работы, где это уместно. (В WebForms, и это моя главная любимая мозоль, это часто заканчивается упаковкой большого количества вещей в условную проверку IsPostBack.)

Теперь, - это , что вы можете сделать. Исходя из вашего вопроса, звучит так, как будто вы хотите пропустить загрузку текущей страницы и вместо этого перейти прямо на страницу выхода из системы. В зависимости от вашей настройки у вас есть несколько подходов:

  • Сделать ссылку выхода из системы не более чем простой ссылкой. Таким образом, браузер будет запрашивать только страницу выхода из системы, в отличие от создания формы POST для текущей страницы (как, например, с помощью кнопки или LinkButton).
  • Если странице выхода из системы действительно требуется какое-либо значение POST, добавленное в нее, создайте собственный HTML form с действием, установленным для страницы выхода из системы. Это предполагает меньше полагаться на элементы управления перетаскиванием на стороне сервера и больше просто на создание простого HTML-кода (что всегда полезно делать в веб-разработке).

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

1 голос
/ 29 декабря 2011

Используйте то, что не имеет жизненного цикла - ASP.NET MVC, как кто-то предложил, или создайте .ashx (обработчик): logout.ashx просто выйдет из системы вошедшего в систему пользователя. Это работало бы без необходимости менять рамки.

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

1 голос
/ 29 декабря 2011

Вызовите совершенно другую страницу, которая будет выполнять только задачу выхода из системы, а не другой соответствующий код.Таким образом, вам не нужно беспокоиться о жизненном цикле страницы.

1 голос
/ 29 декабря 2011

Вы не можете пропустить жизненный цикл страницы;вместо этого вы можете сделать следующее:

Измените эту ссылку logout на обычную ссылку (<a href="...">) и на Page_Load страницы Login, запустите тот код, который вы разместили, но только if(!IsPostBack)

Редактировать

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

<a href="Login.aspx?Logout=y" > Logout </a>

И затем проверить Page_Load:

if (!IsPostBack &&  Request.QueryString["Logout"]=="Y" )
{
   //Your code here
}

Это очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...