在MVC 4中调用控制器的构造函数时检查会话超时

时间:2014-11-17 10:38:48

标签: c# asp.net-mvc-4 session

我正在使用以下方法处理我的MVC 4应用程序中的会话到期:

第1步:创建以下类:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        HttpContext ctx = HttpContext.Current;

         string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower();
         string actonName = filterContext.ActionDescriptor.ActionName.ToLower();
         if (!(controllerName.Contains("account")||(controllerName.Contains("home") && actonName.Contains("index"))))
         {

             // If the browser session or authentication session has expired...
             if (SessionManager.Instance["PlatformId"] == null || !filterContext.HttpContext.Request.IsAuthenticated)
             {
                 if (filterContext.HttpContext.Request.IsAjaxRequest())
                 {

                     filterContext.Result = new JsonResult { Data = "_Logon_" };
                 }
                 else
                 {

                     filterContext.Result = new RedirectToRouteResult(
                         new RouteValueDictionary {
                    { "Controller", "Home" },
                    { "Action", "TimeoutRedirect" }
            });
                 }
             }
         }
        base.OnActionExecuting(filterContext);
    }
}

第2步:将其添加到RegisterGlobalFilters,如下所示:

    filters.Add(new SessionExpireFilterAttribute());

我在会话处于活动状态并且工作正常时对此进行了测试 - 在执行每个操作时,它正在检查会话是否处于活动状态。但问题是我在构造函数中使用会话值初始化一些对象,如下所示:

     public class DashboardController : BaseController
{
    private DashboardService dashboardService;


    public DashboardController()
    {

        dashboardService = new DashboardService(this.DbContext, (int)SessionManager.Instance["PlatformId"]);

    }
 }

当会话超时时,

会引发空引用异常
        dashboardService = new DashboardService(this.DbContext, (int)SessionManager.Instance["PlatformId"])

在会话到期之前进行检查。我不能将所有这些初始化移动到每个动作,因为它是忙乱的 - 我已经有很多动作方法。

有没有办法在调用Constructor方法时检查会话超时?请帮忙。

1 个答案:

答案 0 :(得分:0)

那么,

我正在做的是在应用程序的Application_AcquireRequestState方法(Global.asax)中检查会话

类似这样的事情

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
     if (HttpContext.Current.Handler is IRequiresSessionState)
     {
         var usrobj = HttpContext.Current.Session["User"];
         if(usrobj == null)
         {
             Response.Redirect("~/Login/Index");
         }
     }
}

我不知道你是否想要同样的东西。