Custom ASP.NET WebAPI route not working. Action never gets hit
我正在尝试获取在 ASP.NET WebAPI 中工作的路线,需要一些帮助。
这是我的默认 GET,它完美地映射到我的 api 控制器中的 GetFeedbackPosts(id As string)
1 | /api/feedbackPost/id |
但是,如果您要使用名为 GetFeedbackPostCategories() 的同一个 api 控制器,我还需要另一个 GET"操作"或方法。我正在尝试使用以下 uri 访问它:
1 | /api/feedbackPost/getFeedbackPostCategories |
GetFeedbackPostCategories() 方法永远不会被命中,...它总是命中 GetFeedbackPosts()
这些是我的路线:
1 2 3 4 5 6 7 8 9 10 | RouteTable.Routes.MapHttpRoute( name:="DefaultApi", routeTemplate:="api/{controller}/{id}", defaults:=New With {Key .id = RouteParameter.Optional}) RouteTable.Routes.MapHttpRoute( name:="MVCActionStyleApi", routeTemplate:="api/{controller}/{action}/{id}", defaults:=New With {Key .id = RouteParameter.Optional}) |
我正在尝试定位名为"GeneralApi"的那个。但是,就像我说的那样,它一直在执行错误的操作(控制器上的另一个 Get 操作)。有什么想法吗?
谢谢!
第一个路由将匹配任何形式为 /api/something/something 的 URI,因此在这种情况下不会匹配第二个路由。
一般来说,在 Web API 中混合使用 "{action}" 路由和非动作路由并不能很好地工作。即使您可以使路由正常工作,您通常也会在操作选择方面遇到问题。
例如,如果您对 /api/feedbackPost 发送 GET 请求,则操作选择无法区分这两种方法,因此您将收到"多个匹配操作"错误
1 2 3 4 5 6 7 | public class FeedbackPost : ApiController { public HttpResponseMessage GetFeedbackPosts() [HttpGet] public HttpResponseMessage GetFeedbackPostCategories() } |
根据您的具体情况,一种选择是将 "FeetbackPostCategories" 视为单独的资源并创建一个 "Categories" 控制器,然后使用 GET /api/categories。
或者,Web API 2(目前在 RC 中)支持基于属性的路由,可以让您处理这种情况。
离开你的第二条路线并用默认值
更新它
1 2 3 4 5 | RouteTable.Routes.MapHttpRoute( name:="MVCActionStyleApi", routeTemplate:="api/{controller}/{action}/{id}", defaults:=New With {Key .id = RouteParameter.Optional, Key .action ="GetFeedbackPosts"}) |
附言抱歉语法,似乎是 VB。
然后,您将能够请求第一个 URL
/api/feedbackPost/id
通过修改一个
但没有
因此,您的第二个 URL
但我建议您在控制器中声明操作之前使用属性
证明链接 -> Web API 设计:制作开发人员喜爱的界面