【问题标题】:Custom ASP.NET WebAPI route not working. Action never gets hit自定义 ASP.NET WebAPI 路由不起作用。行动永远不会受到打击
【发布时间】:2013-09-17 13:14:36
【问题描述】:

我正在尝试获取在 ASP.NET WebAPI 中工作的路线,需要一些帮助。

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

  /api/feedbackPost/id

但是,如果您要使用名为 GetFeedbackPostCategories() 的同一个 api 控制器,我还需要另一个 GET“操作”或方法。我正在尝试使用以下 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”的那个。但是,就像我说的那样,它一直在执行错误的操作(控制器上的另一个 Get 操作)。有什么想法吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    例如,如果你发送一个GET请求/api/feedbackPost,动作选择无法区分这两种方法,所以你会得到一个“多个匹配动作”的错误

    public class FeedbackPost : ApiController
    {
        public HttpResponseMessage GetFeedbackPosts()
    
        [HttpGet]
        public HttpResponseMessage GetFeedbackPostCategories()
    }
    

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

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

    【讨论】:

      【解决方案2】:

      留下你的第二条路线并用默认值action = "GetFeedbackPosts"更新它:

      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

      通过修改一个/api/feedbackPost/GetFeedbackPosts/id, 但如果没有id,则有可能:/api/feedbackPost

      因此,您的第二个 URL /api/feedbackPost/getFeedbackPostCategories 最初可以正常工作,您可以添加许多其他 Get 操作。

      但我建议您在控制器中声明操作之前使用属性 [ActionName] 以排除请求名称中带有 get 单词的明显长动词并转换为如下名词:/api/feedbackPost/feedbackPostCategories

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

      【讨论】:

        猜你喜欢
        • 2016-05-10
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2017-11-27
        相关资源
        最近更新 更多