通用处理程序没有在mvc项目中运行

时间:2014-12-22 20:41:46

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

我已经将通用处理程序(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,以防出现问题,但无论是否使用该行,处理程序似乎都不会被调用。

1 个答案:

答案 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()); } }

上注册该处理程序