0

我正在尝试获取在 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 操作)。有任何想法吗?

谢谢!

4

2 回答 2

1

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

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

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

public class FeedbackPost : ApiController
{
    public HttpResponseMessage GetFeedbackPosts()

    [HttpGet]
    public HttpResponseMessage GetFeedbackPostCategories()
}

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

或者,Web API 2(目前在 RC 中)支持基于属性的路由,可以让您处理这种情况。

于 2013-09-17T21:42:06.600 回答
0

只需离开您的第二条路线并使用默认值更新它action = "GetFeedbackPosts"

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

PS对不起语法,似乎是VB。

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

/api/feedbackPost/id

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

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

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

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

于 2014-03-12T22:43:23.437 回答