我在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"
}
);
答案 0 :(得分: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方法的路由。这种方式请求总是转到你想要的行动