自定义ASP.NET WebAPI路由不起作用。行动永远不会受到打击

时间:2013-09-17 13:14:36

标签: asp.net asp.net-web-api

我正在尝试在ASP.NET WebAPI中使用路由并需要一些帮助。

这是我的默认GET,在我的api控制器中完美映射到GetFeedbackPosts(id As string)

  /api/feedbackPost/id

然而,我还需要另一个GET"动作"或者方法,如果你将在同一个称为GetFeedbackPostCategories()的api控制器中。我试图用以下uri访问它:

/api/feedbackPost/getFeedbackPostCategories

GetFeedbackPostCategories()方法永远不会被击中,...它总是命中GetFeedbackPosts()

这些是我的路线:

    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"的那个。但是,就像我说的那样,它一直在执行错误的操作,(另一个在控制器上执行操作)。任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

第一个路由将匹配任何形式为/ api / something / something的URI,因此在这种情况下第二个路由不匹配。

通常,在Web API中将“{action}”路由与非操作路由混合使用效果不佳。即使您可以使路由工作,您通常也会遇到操作选择问题。

例如,如果您发送/ api / feedbackPost的GET请求,则操作选择无法区分这两种方法,因此您将收到“多个匹配操作”错误

public class FeedbackPost : ApiController
{
    public HttpResponseMessage GetFeedbackPosts()

    [HttpGet]
    public HttpResponseMessage GetFeedbackPostCategories()
}

根据您的具体情况,一个选项是将“FeetbackPostCategories”视为单独的资源并创建“类别”控制器,并使用GET / api / categories。

或者,Web API 2(目前在RC中)支持attribute-based routing,这可以让您处理这种情况。

答案 1 :(得分:0)

只需离开第二条路线,然后使用默认值action = "GetFeedbackPosts"更新它:

RouteTable.Routes.MapHttpRoute(
  name:="MVCActionStyleApi",
  routeTemplate:="api/{controller}/{action}/{id}",
  defaults:=New With {Key .id = RouteParameter.Optional,
                      Key .action = "GetFeedbackPosts"})

P.S。抱歉语法,似乎是VB。

然后,您将能够请求第一个网址

  

/ API / feedbackPost / ID

修改后的/api/feedbackPost/GetFeedbackPosts/id, 但如果没有id,则有可能:/api/feedbackPost

因此,您的第二个网址/api/feedbackPost/getFeedbackPostCategories最初可以使用,您可以添加许多其他获取操作。

但我建议您在声明控制器中的操作之前使用属性[ActionName],以便在名称中使用获取单词排除请求这个明显的长动词并转换为这样的名词:{{1} }。

证明链接 - > Web API Design: Crafting Interfaces that Developers Love