【问题标题】:Handle Session Timeout in .Net MVC Razor在 .Net MVC Razor 中处理会话超时
【发布时间】:2012-11-10 12:40:50
【问题描述】:

我正在开发一个基于 API 的网站,客户端正在.Net MVC 中开发。对于异常处理,我使用的是

 public void Application_Error(object sender, EventArgs e)
        {
            string action = "Index";
            Exception exception = Server.GetLastError();
            Response.Clear();

            HttpException httpException = exception as HttpException;

            if (httpException != null)
            {


                switch (httpException.GetHttpCode())
                {
                    case 404:
                        // page not found
                        action = "Error404";
                        break;
                    default:
                        action = "Index";
                        break;
                }

                // clear error on server
                Server.ClearError();
            }
            Response.Redirect(String.Format("/error/{0}", action));
        }

所以对于控制器的 try catch 抛出的任何异常,页面都会重定向到错误页面。

现在我希望当会话过期时它应该重定向到登录页面,我该怎么做?

现在发生的事情是,在会话到期后,当我尝试访问会话值时,它会抛出异常“object reference not set to an instance of object”。然后它会重定向到默认的错误页面。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 razor session-state


    【解决方案1】:

    我认为您无法从通用异常处理程序内部执行此操作,因为 - 正如您所说 - 缺少会话变量只会抛出 NullReferenceException。从控制器对会话变量执行空检查:

    Public ActionResult MyAction ()
    {
        if (Session["myVariable"] == null)
        {
            RedirectToAction("SessionTimeOut", "Error");
        }
    
        ...
    
    }
    

    如果您的会话变量应该始终存在,除非会话已过期,您可以尝试为您的控制器覆盖 OnActionExecuting 方法并在那里执行您的空值检查。要为多个控制器执行此操作,请定义 BaseController,覆盖其 OnActionExecuting 方法,然后在其他控制器中继承此方法。

    【讨论】:

    • 我已经尝试过使用它,但在我的情况下,控制器可以通过登录和不登录来访问。当用户登录时,他会看到一个包含一些附加项目的菜单,在这种情况下,当会话到期并且他单击登录后可访问的项目时,nullreferenceexception 被抛出。
    • 尝试将 [Authorize] 属性放在需要登录的控制器操作上 - 然后像处理 404 一样在您的方法中处理 401 错误。
    • 我正在处理来自 web.config 的 [Authorize] 属性。我在 web.config 中定义了一个控制器,它在其上重定向 id [Authorize] 属性并且请求未授权。无论如何,我正在考虑您关于覆盖OnActionExecuting 的建议,在这种情况下,如果会话过期,Ajax request 是否也会被重定向,或者对于AJAX,我必须使用一些单独的方法?
    • Ajax 请求将被重定向 - 您的浏览器不会。如果您使用 [Authorize] 方法,您可以在 jQuery Ajax 调用中处理 401 响应,如下所述:stackoverflow.com/questions/6991749/…
    猜你喜欢
    • 2017-10-06
    • 2019-08-16
    • 2016-03-27
    • 2011-09-25
    • 2012-08-16
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多