我已经将通用处理程序(KeepSessionAlive.ashx)添加到我的mvc 4项目的根目录中。处理程序中的代码是:
public class KeepSessionAlive : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Session["KeepSessionAlive"] = DateTime.Now;
}
public bool IsReusable
{
get
{
return false;
}
}
}
每当我运行我的应用程序并在调试时检查时,我都没有看到Session["KeepSessionAlive"]
被设置。我尝试在处理程序中的ProcessRequest
方法中添加一个断点,但是当我浏览网站时,断点永远不会被击中。我还需要做其他任何事情来让应用程序拿起处理程序吗?
我们做过类似于webforms项目的事情,我不记得在那里做任何其他事情。我还更新了我的路线,包括:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
//other routes skipped
}
我在那里添加了.ashx
,以防出现问题,但无论是否使用该行,处理程序似乎都不会被调用。
答案 0 :(得分:2)
您可以覆盖OnActionExecuted
的{{1}}方法。
Controller
在此之后,只需从此public class BaseController : Controller
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Session["KeepSessionAlive"] = DateTime.Now;
}
}
派生您的控制器。这是一种更多的MVC方式'。
另一种方法是创建自定义BaseController
并将其全局应用,如SLaks所述:
ActionFilter
您需要记住注册
public class KeepSessionAliveAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Session["KeepSessionAlive"] = DateTime.Now;
}
}
PS:您的处理程序可能无法正常工作,因为您尚未在public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new KeepSessionAliveAttribute());
}
}