c# - 这些 Web API 路由的顺序有什么问题

标签 c# asp.net-web-api routes asp.net-web-api-routing

所以我在 WebApiConfig.cs 文件中添加了一些路由,我可以让第一次和第二次调用工作,但不能让 GADailyAPI 调用工作。我得到一个 404。当第一次编写代码时,前两行路由位于底部,它们会抛出 404。我尝试更改顺序,但我无法让它们全部工作。有任何想法吗? 注意:这不是我的代码,所以如果可以的话,我不想修改太多的 API 代码。如果我能弄清楚路由顺序并修复它,那将是最好的解决方案

        config.Routes.MapHttpRoute(
            name: "GAMonthlyApiNetworkStats",
            routeTemplate: "api/{controller}/{action}/{Year}/{Month}",
            defaults: new { controller = "GAMonthlyAPI", action = "NetworkStats" }
        );

        config.Routes.MapHttpRoute(
            name: "GAMonthlyApiAllStats",
            routeTemplate: "api/{controller}/{action}/{Year}/{Month}",
            defaults: new { controller = "GAMonthlyAPI", action = "AllStats", }
        );

        config.Routes.MapHttpRoute(
            name: "GADailyApiNetworkStats",
            routeTemplate: "api/{controller}/{action}/{StartDate}/{EndDate}",
            defaults: new { controller = "GADailyAPI", action = "NetworkStats" }
        );

        config.Routes.MapHttpRoute(
            name: "GADailyApiAllStats",
            routeTemplate: "api/{controller}/{action}/{StartDate}/{EndDate}",
            defaults: new { controller = "GADailyAPI", action = "AllStats" }
        );

        config.Routes.MapHttpRoute(
            name: "GAMonthlyApiGroupStats",
            routeTemplate: "api/{controller}/{action}/{Year}/{Month}/{GroupID}",
            defaults: new { controller = "GAMonthlyAPI", action = "GroupStats" }
        );
        config.Routes.MapHttpRoute(
            name: "GAMonthlyApiSiteStats",
            routeTemplate: "api/{controller}/{action}/{Year}/{Month}/{SiteID}",
            defaults: new { controller = "GAMonthlyAPI", action = "SiteStats" }
        );

        config.Routes.MapHttpRoute(
            name: "GADailyApiGroupStats",
            routeTemplate: "api/{controller}/{action}/{StartDate}/{EndDate}/{GroupID}",
            defaults: new { controller = "GADailyAPI", action = "GroupStats" }
        );
        config.Routes.MapHttpRoute(
            name: "GADailyApiSiteStats",
            routeTemplate: "api/{controller}/{action}/{StartDate}/{EndDate}/{SiteID}",
            defaults: new { controller = "GADailyAPI", action = "SiteStats" }
        );

最佳答案

order 没有错,因为第一个匹配总是赢,所以无论您以什么顺序放置一条包含 5 个以 /api 开头的路段的路线,只有第一个路线将到达。这是因为像 {action} 这样的占位符实际上可以是任何字符串。所以你基本上是在说:

Match if the url is: /api/<anything>/<anything>/<anything>/<anything>

在所有前 4 条 route ,并且:

Match if the url is: /api/<anything>/<anything>/<anything>/<anything>/<anything>

其余的。

要解决此问题,您需要以某种方式限制路由,以便路由框架在不匹配时跳过第一条路由,然后继续下一条路由并尝试匹配该路由。

    config.Routes.MapHttpRoute(
        name: "GAMonthlyApiNetworkStats",
        routeTemplate: "api/{controller}/NetworkStats/{Year}/{Month}",
        defaults: new { controller = "GAMonthlyAPI", action = "NetworkStats" }
    );

    config.Routes.MapHttpRoute(
        name: "GAMonthlyApiAllStats",
        routeTemplate: "api/{controller}/AllStats/{Year}/{Month}",
        defaults: new { controller = "GAMonthlyAPI", action = "AllStats", }
    );

现在,/api/GAMonthlyAPI/AllStats/2012/09 等 URL 将跳过第一条路线,因为 AllStats 段与第三段不匹配,并且将匹配第二条路线,因为第三段与传递的值相同。

引用:Why map special routes first before common routes in asp.net mvc?

关于c# - 这些 Web API 路由的顺序有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590429/

相关文章:

Rest API 为同一资源设计多个 URL?

javascript - (Symfony 4) FOS Js Routing Bundle - 路由 ------ 不存在。

c# - Asp.Net 中的空对象引用

asp.net - 具有自定义模型和 OData 的 Entity Framework 5 - Web API

asp.net-web-api - 撤销 WebApi 2.1 不记名 token

ruby-on-rails - Ruby on Rails RSpec 路由失败

linux - 如何配置 Docker 以使用我的 ens34 网络接口(interface)(而不是 eth0)?

c# - Microsoft 推送通知服务和 Windows Phone 7/8

c# - ResourceDictionary : {"Key cannot be null.\r\nParameter name: key"} 中的运行时错误

c# - 如何实现数据大小限制的缓存?