сеанс истекает и выдает страницу с ошибкой - PullRequest
1 голос
/ 26 ноября 2009

Мое приложение выдает ошибку, когда сеанс истекает.

Я не хочу, чтобы сессии истекали автоматически ....

но если нет способа сделать это, вместо того, чтобы показывать ошибку, он должен быть перенаправлен на страницу входа ...

Я пытался сделать это ....

Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");

этот код не работает после истечения сеанса .. я получаю сообщение об ошибке

Ответ недоступен в этом контексте.

веб-конфиг имеет это

<authentication mode="Forms">
        <forms loginUrl="Login.aspx" name="Cookie" timeout="10080" path="/">
        </forms>
    </authentication>
    <authorization>
        <deny users="?"/>
        <allow users="*"/>
    </authorization>

Что-нибудь еще мне нужно добавить в веб-конфигурацию ...

любые предложения ... спасибо

это загрузка моей страницы

 protected void Page_Load(object sender, EventArgs e)
    {
        Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60) + 10) + "; URL=Login.aspx");
        string userName = Session["userName"].ToString();
        string password = Session["password"].ToString();
        string domain = Session["domain"].ToString();

        impersonateValidUser(userName, domain, password);


    }

Ответы [ 4 ]

1 голос
/ 26 ноября 2009

Я решил это в моей главной странице Page_Load.

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

Например:

// Assuming your using master pages (if not you could have this in a base page that all
// your pages inherit from.
protected void Page_Load(object sender, EventArgs e)
{
    if (Session["SomeKey"] == null)
    {
        // Session has expired or person has not signed in so redirect.
        FormsAuthentication.SignOut();
        Session.Abandon();
        Response.Redirect("signin.aspx", true);
    }

    // If all is good continue and do whatever you normally do.
}

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

1 голос
/ 26 ноября 2009

Я не уверен, в чем заключается ваша проблема, но в качестве альтернативы рассмотрите возможность использования клиентской части решения javascript, чтобы предложить пользователю обновить сеанс до истечения срока его действия. Если пользователь не может утвердительно согласиться на продление сеанса, перенаправьте его на страницу Logout , чтобы прервать сеанс, не давая ему просто истечь. Обычно ваша страница выхода из системы будет перенаправлена ​​обратно на страницу входа в систему, поэтому пользователю, когда он вернется на свой компьютер, будет предложено войти в систему. Если пользователь нажимает кнопку «ОК» (я хочу возобновить сеанс) в диалоговом окне обновления, а затем используйте запрос на странице Keepalive, как предлагает @Come, хотя я бы сделал это с AJAX вместо iframe.

Вы можете посмотреть пример кода , который делает это в контексте ASP.NET MVC, в моем блоге .

0 голосов
/ 26 ноября 2009

Это плохая идея иметь постоянные сессии на вашем сайте, но вы можете сделать это, указав большие значения времени ожидания в web.config

<sessionState  timeout="6000"/>
0 голосов
/ 26 ноября 2009

Что вы можете сделать, это добавить невидимый iframe на свою страницу:

<iframe src="keepalive.aspx" style="width:0px;height:0px"></iframe>

И keepalive.aspx содержит следующее:

<%@ Page Language="C#" Inherits="Keepalive" EnableSessionState="True"%>
<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" >
<html>
  <head>
   <META http-equiv="refresh" content="60"/>
  </head>
  <body></body>
</html>

Каждые 60 секунд keepalive.aspx обновляется, в результате чего сеанс остается живым. Вы можете установить время ожидания сеанса, например, до 2 минут. Таким образом, сессия будет очищена очень скоро после того, как пользователь покинул вашу страницу.

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