1

我在 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"
            }
        );
4

1 回答 1

4

根据您定义路线的顺序,匹配的路线可能不是您希望将请求发送到的路线。特别是您的 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 方法。这样,请求总是转到您希望它执行的操作

于 2012-04-17T02:04:21.647 回答