我一直在为我的路由而苦苦挣扎一段时间,经过几天尝试谷歌解决方案而没有运气,我希望有人能够阐明我的问题。
我的 WebApiConfig 中有以下路由:
config.Routes.MapHttpRoute(
name: "AccountStuffId",
routeTemplate: "api/Account/{action}/{Id}",
defaults: new { controller = "Account", Id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "AccountStuffAlias",
routeTemplate: "api/Account/{action}/{Alias}",
defaults: new { controller = "Account", Alias = RouteParameter.Optional }
);
以及以下控制器方法:
[HttpGet]
public Account GetAccountById(string Id)
{
return null;
}
[HttpGet]
public Account GetAccountByAlias(string alias)
{
return null;
}
如果我打电话: /API/Account/GetAccountById/stuff
然后它正确地调用GetAccountById
.
但是如果我打电话给/API/Account/GetAccountByAlias/stuff
,那么什么都不会发生。
显然,这里的顺序很重要,因为如果我在我的 WebApiConfig 中切换我的路由声明,那么/API/Account/GetAccountByAlias/stuff
正确地调用 GetAccountByAlias
,而/API/Account/GetAccountById/stuff
什么也不做。
这两个[HttpGet]
装饰品是我在谷歌上找到的一部分,但它们似乎并没有解决这个问题。
有什么想法吗?我做错了什么吗?
编辑:
当路由失败时,页面将显示以下内容:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:6221/API/Account/GetAccountByAlias/stuff'.
</Message>
<MessageDetail>
No action was found on the controller 'Account' that matches the request.
</MessageDetail>
</Error>
您应该只能使用以下路由:
config.Routes.MapHttpRoute(
name: "AccountStuffId",
routeTemplate: "api/Account/{action}/{Id}",
defaults: new { controller = "Account", Id = RouteParameter.Optional }
);
并为您的操作执行以下操作:
[HttpGet]
public Account GetAccountById(string Id)
{
return null;
}
[HttpGet]
public Account GetAccountByAlias([FromUri(Name="id")]string alias)
{
return null;
}
理由需要声明两条不同的路线?
查看指南:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
他们有一个默认路由,按照示例,您在配置中所需要的只是
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);