试图了解Web API路由。
我有以下两个控制器,它们有不同的方法/操作
public class MerchantController : ApiController
{
[HttpGet]
[ActionName("GetSuggestedMerchants")]
public IEnumerable<Merchant> GetSuggestedMerchants(string name)
{
....
和
public class PortalMerchantController : ApiController
{
[HttpGet]
[ActionName("GetNPortalMerchants")]
public IEnumerable<PortalMerchantDto> GetNPortalMerchants(int id)
{
...
我已经映射了这两条路线:
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "ActionApiTwoParams",
routeTemplate: "api/{controller}/{action}/{name}"
);
致电
$http.get("api/PortalMerchant/GetNPortalMerchants/26")
工作正常但是打电话
$http.get("api/Merchant/GetSuggestedMerchants/SomeName")
不会被路由并失败:
{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:2769/api/Merchant/GetSuggestedMerchants/SomeName'.","MessageDetail":"No action was found on the controller 'Merchant' that matches the request."}
我认为我需要两个根,因为两个方法的参数名称和类型不同。任何人都可以建议为什么第二个不会被路由?
答案 0 :(得分:2)
路由选择与URL匹配的第一条路由。
您的网址不包含命名参数..只是参数值。
您需要定义更严格的routeTemplate
。像:
config.Routes.MapHttpRoute(
name: "PortalMerchantAPI",
routeTemplate: "api/PortalMerchant/{action}/{name}"
);
config.Routes.MapHttpRoute(
name: "MerchantAPI",
routeTemplate: "api/Merchant/{action}/{id}"
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
路线的顺序很重要