Asp.net mvc 如何在ASP.NET MVC 4中映射这些WebApi路由?

Asp.net mvc 如何在ASP.NET MVC 4中映射这些WebApi路由?,asp.net-mvc,asp.net-mvc-routing,asp.net-web-api,Asp.net Mvc,Asp.net Mvc Routing,Asp.net Web Api,我主要使用默认的WebApi路由映射,如下所示: routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 这很好,我的URL如下所示: [GET] /api/customers

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

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
这很好,我的URL如下所示:

    [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数据(一个用于“创建”,一个用于“搜索”),路由无法区分它们

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


请提供建议?

添加以下路线如何:

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

就在DefaultApi路由映射之前?

这仍然存在相同的问题,即默认路由仍然与URL匹配,因此我得到了“多个操作匹配”错误。我认为添加路由映射的顺序没有任何区别(但我确实按照您建议的顺序进行了尝试,以防万一)。添加路由的顺序会有所不同,因为路由是按定义的顺序添加到集合中的。然后,路由引擎将查找匹配的路由,直到找到一个,然后停止。因此,第一个与url匹配的路由(基于列表中的位置)将被选中。您能否显示您的操作签名?您所说的“我将发布一个表示搜索条件的对象”是什么意思?请您给出一个发布示例(创建新对象)基于搜索条件?我的意思是,我将在请求正文中发布一个定义搜索条件的对象,而不是在搜索条件中使用querystring参数。因此,URL将只是/api/customers/search,但请求正文将包含一个XML或JSON块,告诉服务器要搜索哪些词,等等。为什么你不使用[POST]/api/customers吗?search={你的搜索词}?因为我的URL太长。搜索条件包括日期范围、标记和各种其他选项-这就是我需要发布它的原因。发布意味着您需要在web服务器上创建资源,如果您只是查询并且不修改任何内容,请使用GET,这是设计REST的原则。在您的查询中搜索条件太长也无关紧要y:)