我正在使用以下方法处理我的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方法时检查会话超时?请帮忙。
答案 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");
}
}
}
我不知道你是否想要同样的东西。