【问题标题】:Session-less HttpHandler and routing to custom handler for only one controller .NET仅用于一个控制器 .NET 的无会话 HttpHandler 和路由到自定义处理程序
【发布时间】:2016-10-17 04:49:43
【问题描述】:

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

虽然我的第二个问题是,对于使用此“无会话”处理程序的唯一控制器,应用程序似乎没有遵循我的新路由规则:

    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;
    }
}

我希望只有我的“无会话”控制器将使用此自定义处理程序,而所有其他控件使用默认值。

【问题讨论】:

  • 在顶部添加最具体的路线,在底部添加通用路线

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


【解决方案1】:

您需要颠倒您的路线顺序,以便最具体的路线在您的一般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 }
);

完整说明请参见Why map special routes first before common routes in asp.net mvc

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2023-03-03
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多