在.Net MVC Razor中处理会话超时

时间:2012-11-22 06:48:55

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

我正在开发一个基于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));
        }

因此,对于来自Controller的try catch抛出的任何异常,页面会重定向到错误页面。

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

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

1 个答案:

答案 0 :(得分:2)

我认为你不能在通用异常处理程序中执行此操作,因为 - 如您所说 - 缺少会话变量只需抛出NullReferenceException。从控制器对会话变量执行空检查:

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

    ...

}

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