【问题标题】:ASP.NET Web Api Routing Failing to catch parametersASP.NET Web Api 路由无法捕获参数
【发布时间】:2012-04-27 00:14:00
【问题描述】:

我在 global.asax.cs 文件中设置了一些路由,如下所示:

routes.MapHttpRoute(
            name: "ColorsRoute",
            routeTemplate: "api/{controller}/{action}/{styleId}",
            defaults: new
            {
                controller = "Cars",
                action = "Colors"
            }
        );

控制器:

    public Dictionary<string, string> Colors(string styleid)
    {
        //returns a dictionary of colors and ids
    }

问题是当使用这样的网址时:

localhost:58645/api/cars/colors/18752867

不选择 styleId,但它通常像这样使用它:

localhost:58645/api/cars/colors?styleid=18752867

关于为什么会发生这种情况的任何想法?

更新:

这些路由在“domain.com/api/cars/makes/new”这样的调用中运行良好:

        routes.MapHttpRoute(
            name: "MakesRoute",
            routeTemplate: "api/{controller}/{action}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Makes"
            }
        );

控制器:

    public Dictionary<string, string> Makes(string state)       
    {
        //return dictionary of makes and ids
    }

以下是我的其他路线:

        routes.MapHttpRoute(
            name: "ModelsRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{state}",
            defaults: new
            {
                controller = "Cars",
                action = "Models"
            }
        );

        routes.MapHttpRoute(
            name: "YearsRoute",
            routeTemplate: "api/{controller}/{action}/{modelId}/{state}",
            defaults: new {
                controller = "Cars",
                action = "Years"
            }
        );

        routes.MapHttpRoute(
            name: "StylesRoute",
            routeTemplate: "api/{controller}/{action}/{make}/{model}/{year}",
            defaults: new {
                controller = "Cars",
                action = "Styles"
            }
        );

【问题讨论】:

  • 你说你有一些路线,但你只显示了一个。您的 Global.Asax 中是否还有其他路线

标签: rest routes asp.net-mvc-routing asp.net-web-api input-parameters


【解决方案1】:

根据您定义路线的顺序,匹配的路线可能不是您希望将请求发送到的路线。特别是您的 YearsRoute 和 ModelsRoute。您有相同数量的段,但没有指定任何路由约束。

尝试将 MapHttpRoute 作为您的第一个注册路由,并添加正则表达式约束

routes.MapHttpRoute(
        name: "ColorsRoute",
        routeTemplate: "api/{controller}/{action}/{styleId}",
        defaults: new
        {
            controller = "Cars",
            action = "Colors"
        },
      constraints: new { styleId = @"\d+" }
    );

现在看看是否匹配。

更新
另一种选择是专门为您的 URI 定义一个路由,该路由直接映射到您想要使用的 ApiController 和 Action 方法。这样,请求总是转到您希望它执行的操作

【讨论】:

  • 事实证明 MakesRoute 与它发生冲突,所以我在物理上定义了使其工作的控制器和动作。如果你用这些方面的东西更新你的答案,我会把它排除在外。
猜你喜欢
  • 2017-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多