无会话 HttpHandler 和路由到仅一个控制器 .NET 的自定义处理程序

Session-less HttpHandler and routing to custom handler for only one controller .NET

我们有一个 Web 应用程序,它会每 30 秒对服务器进行一次 AJAX 调用,以更新页面中的值。该应用程序本身是 MVC 和 webforms 的混合体(该应用程序的一部分已升级为 MVC,而另一部分仍然是遗留的)。 AJAX 调用的问题是它将重置会话超时,基本上不允许用户超时。我发现的解决方法来自这个答案 (Disable Session state per-request in ASP.Net MVC),它是创建一个不使用 Session 的新处理程序。这应该可以解决问题。

虽然我的第二个问题是应用程序似乎没有遵循我的新路由规则,因为它是唯一使用此 "session-less" 处理程序的控制器:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "FirstController", action = "Index", id = UrlParameter.Optional }
    );
        routes.Add("Sessionless", new Route("SessionlessController/SessionlessAction/{id}",
                new RouteValueDictionary(new { id= UrlParameter.Optional }),
                new SessionlessHandler()));

我的处理程序上有一个断点,但应用程序似乎没有转到处理程序:

public class SessionlessHandler: IRouteHandler {
    public IHttpHandler GetHttpHandler(RequestContext requestContext) {
        return null;
    }
}

我希望只有我的 "session-less" 控制器会使用这个自定义处理程序,而所有其他控件都使用默认值。

您需要颠倒路线的顺序,以便最具体的路线在 之前 执行常规 Default 路线。

routes.Add("Sessionless", new Route("SessionlessController/SessionlessAction/{id}",
        new RouteValueDictionary(new { id= UrlParameter.Optional }),
        new SessionlessHandler()));

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "FirstController", action = "Index", id = UrlParameter.Optional }
);

有关完整说明,请参阅