【问题标题】:How can I map these WebApi routes in ASP.NET MVC 4?如何在 ASP.NET MVC 4 中映射这些 WebApi 路由?
【发布时间】:2012-08-06 18:19:18
【问题描述】:

我主要是使用默认的WebApi路由映射,如下:

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

一切正常,我的网址如下所示:

    [GET]  /api/customers    Get all customers
    [GET]  /api/customers/1  Get a specific customer
    [POST] /api/customers    Create a customer

到目前为止一切都很好,但现在我想添加一个“搜索”工具。为此,我将发布一个表示搜索条件的对象,因为在 URL 上作为 GET 执行此操作的选项太多。我的计划是 URL 看起来像这样:

    [POST] /api/customers/search

但是,使用上面的默认路由,服务器抱怨“找到了与请求匹配的多个操作”,我认为这是因为我现在有两个接受 POST 数据的控制器方法(一个用于“创建”,一个用于"search"),并且路由没有办法区分它们。

我尝试添加一个包含 {action} 组件的新路由映射,但这并没有解决问题 - 大概是因为 URL 对 both 路由映射都有效。 (我需要以某种方式阻止“/search”变体与默认路由图匹配。

请给点建议?

【问题讨论】:

  • “我将发布一个代表搜索条件的对象”是什么意思?请您根据搜索条件举例说明 POST(创建新对象)吗?
  • 我的意思是,我将在我的请求正文中发布一个定义搜索词的对象,而不是在我的搜索词等中使用查询字符串参数。所以 URL 将简单地是 /api/customers/search 但请求正文将包含一个 XML 或 JSON 块,告诉服务器要搜索哪些词等。
  • 你为什么不使用 [POST] /api/customers?search={your search term}?
  • 因为我的网址太长了。搜索条件包括日期范围、标签和各种其他选项——这就是我需要发布它的原因。
  • POST 表示你需要在web服务器上创建资源,如果你只是查询而不修改任何东西,使用GET,这是设计REST的原则。查询中的搜索条件很长也没关系:)

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


【解决方案1】:

如何添加以下路由:

routes.MapHttpRoute(
        name: "SearchRouteName",
        routeTemplate: "api/{controller}/search/{id}",
        defaults: new { controller = "customers", id = RouteParameter.Optional }
    );

就在 DefaultApi 路由映射之前?

【讨论】:

  • 这仍然遇到同样的问题,即默认路由仍然与 URL 匹配,因此我收到“多个操作匹配”错误。我不认为您添加路线图的顺序有什么不同(但我确实按照您建议的顺序尝试过,以防万一)。
  • 添加路由的顺序确实会有所不同,因为路由是按照定义的顺序添加到集合中的。然后,路由引擎将寻找匹配的路由,直到找到一个然后停止。因此,将选择与您的 url 匹配的第一条路由(基于列表中的位置)。你能出示你的动作签名吗?
猜你喜欢
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2012-09-03
  • 2011-04-10
  • 2010-11-08
  • 2016-07-16
  • 2023-03-27
相关资源
最近更新 更多