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

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 中)支持基于属性的路由,可以让您处理这种情况。


离开你的第二条路线并用默认值 action ="GetFeedbackPosts":

更新它

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

通过修改一个/api/feedbackPost/GetFeedbackPosts/id
但没有 id 是可能的: /api/feedbackPost.

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

但我建议您在控制器中声明操作之前使用属性 [ActionName] 以排除请求具有 get word in name 的明显长动词并转换为像这样的名词:/api/feedbackPost/feedbackPostCategories

证明链接 -> Web API 设计:制作开发人员喜爱的界面