会话到期并给出错误页面

时间:2009-11-26 05:38:05

标签: c# asp.net session login

我的应用程序在会话过期时抛出错误。

我不希望会话自动过期....

但是如果没有办法做到这一点,那么它应该被重定向到登录页面而不是显示错误...

我试着这样做....

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 个答案:

答案 0 :(得分:1)

我不确定您的问题所在,但作为替代方案,请考虑使用javascript解决方案客户端提示用户在到期前续订其会话。如果用户未能肯定地同意会话续订,则重定向到注销页面以终止会话而不会让其过期。通常,您的“注销”页面将重定向回“登录”页面,以便用户在返回计算机时将被提示登录。如果用户确实单击了续订对话框中的确定(我想续订会话)按钮,那么就像@Come建议的那样使用对Keepalive页面的请求,尽管我会使用AJAX而不是iframe。

您可以在sample code上的ASP.NET MVC上下文中查看执行此操作的blog

答案 1 :(得分:1)

我已在我的母版页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,如果这样做,则对值为null的情况做出适当的反应。

答案 2 :(得分:0)

您可以做的是向页面添加不可见的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分钟。这样,会话将在用户离开您的页面后立即清理。

答案 3 :(得分:0)

在您的网站上建立永久会话是一个坏主意,但您可以通过在web.config中为会话超时提供大值来实现此目的

<sessionState  timeout="6000"/>