在Web Api中发现了多个与请求匹配的操作

当我尝试有2个“Get”方法时,我一直得到这个错误

发现了多个与请求:webapi匹配的操作

我一直在看其他类似的问题,但我不明白。

我有2个不同的名字,并使用“HttpGet”属性

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}


[HttpGet]
public HttpResponseMessage FullDetails()
{
return null;
}
227928 次浏览

有可能你的webmethods被解析为相同的url。请浏览以下连结:-

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

所以,你可能需要将你的methodname添加到路由表中。

你的路线图在WebApiConfig.cs中可能是这样的:

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

但是为了让同一个http方法有多个动作,你需要通过路由为webapi提供更多的信息,如下所示:

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

注意,routeTemplate现在包含了一个动作。这里有更多信息:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

更新:

好吧,现在我想我明白你想要的是什么了,下面是另一个例子:

也许你不需要action url参数,而应该用另一种方式描述你想要的内容。既然你说的是方法从同一个实体返回数据,那么就让参数为你做描述。

例如,你的两个方法可以变成:

public HttpResponseMessage Get()
{
return null;
}


public HttpResponseMessage Get(MyVm vm)
{
return null;
}

在MyVm对象中传递什么类型的数据?如果你能够通过URI传递变量,我建议你走那条路。否则,你需要在请求的主体中发送对象,当你做一个GET时,这不是很HTTP(虽然它是有效的,只是在MyVm前面使用[FromBody])。

希望这说明了您可以在一个控制器中有多个GET方法,而不使用动作名称或甚至[HttpGet]属性。

如果不使用操作,选项将是:

  1. 将其中一个方法移动到不同的控制器,这样它们就不会冲突。

  2. 只使用一个接受参数的方法,如果它为空,则调用代码中的另一个方法。

在Web API中(默认情况下),方法是基于HTTP方法和路由值的组合选择的。

MyVm看起来像一个复杂的对象,由格式化程序从对象体中读取,因此在路由数据方面有两个相同的方法(因为它们都没有来自路由的任何参数)——这使得分派器(IHttpActionSelector)不可能匹配适当的方法。

您需要通过查询字符串或路由参数来区分它们以解决歧义。

请检查你有两个方法有不同的名称和相同的参数。

如果是这样,请删除任何方法,并尝试。

经过大量的网络搜索,并试图找到最适合的路由映射形式 如果已经找到以下

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

这些映射适用于动作名称映射和基本的http约定(GET,POST,PUT,DELETE)

我发现,当我有两个Get方法时,一个无参数,一个以复杂类型作为参数,我得到了相同的错误。我通过添加一个名为Id的int类型的虚拟参数作为我的第一个参数来解决这个问题,后面跟着我的复杂类型参数。然后,我将复杂类型参数添加到路由模板中。下面的方法对我很有效。

第一个获得:

public IEnumerable<SearchItem> Get()
{
...
}

第二个获得:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

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

我在尝试用额外的操作来增强我的WebAPI控制器时偶然发现了这个问题。

假设你会

public IEnumerable<string> Get()
{
return this.Repository.GetAll();
}


[HttpGet]
public void ReSeed()
{
// Your custom action here
}

现在有两个方法可以满足/api/controller的请求,这个请求会触发TS所描述的问题。

我不想为我的附加动作添加“虚拟”参数,所以我查看了默认动作,并提出:

[ActionName("builtin")]
public IEnumerable<string> Get()
{
return this.Repository.GetAll();
}

对于第一种方法,结合“dual”路由绑定:

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "builtin", id = RouteParameter.Optional },
constraints: new { id = @"\d+" });


config.Routes.MapHttpRoute(
name: "CustomActionApi",
routeTemplate: "api/{controller}/{action}");

请注意,即使在第一个路由模板中没有“action”参数,显然你仍然可以配置一个默认动作,允许我们分离“正常”WebAPI调用的路由和对额外动作的调用。

这是可能的,因为使用MVC控制器而不是Web API控制器。 检查Web API控制器中的命名空间,它应该如下所示

using System.Net;
using System.Net.Http;
using System.Web.Http;

如果命名空间如下所示,则在web api控制器方法调用时给出上述错误

using System.Web;
using System.Web.Mvc;

从Web API 2开始更新。

在WebApiConfig.cs文件中使用这个API配置:

public static void Register(HttpConfiguration config)
{
//// Web API routes
config.MapHttpAttributeRoutes(); //Don't miss this


config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
}

你可以像这样路由我们的控制器:

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}


[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
return null;
}

其中ControllerName是控制器的名称(没有"controller")。这将允许您使用上面详细介绍的路由获取每个操作。

进一步阅读:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

我知道这是一个老问题,但有时,当你使用AngularJS中的服务资源连接到WebAPI时,确保你使用了正确的路由,否则会发生这个错误。

确保你没有装饰你的控制器方法默认的GET|PUT|POST|DELETE动作与[HttpPost/ PUT / GET / DELETE]属性。我已经将此属性添加到我的香草后控制器动作,它导致404。

希望这能帮助到一些人,因为它可能会非常令人沮丧,并导致进展停滞。

这个解决方案对我很有效。

请将Route2放在WebApiConfig的前面。在每个方法之前添加HttpGet和HttpPost,并在url中包含控制器名和方法名。

WebApiConfig = >

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

控制器= >

public class ValuesController : ApiController
{


[HttpPost]
public string GetCustomer([FromBody] RequestModel req)
{
return "Customer";
}


[HttpPost]
public string GetCustomerList([FromBody] RequestModel req)
{
return "Customer List";
}
}

Url = >

http://localhost:7050/api/Values/GetCustomer


http://localhost:7050/api/Values/GetCustomerList

这是每个知道一切都是正确的并检查了50次的人的答案……

确保你没有反复查看RouteConfig.cs

要编辑的文件名为WebApiConfig.cs

另外,它应该是这样的:

using System.Web.Http;


namespace My.Epic.Website
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();


// api/Country/WithStates
config.Routes.MapHttpRoute(
name: "ControllerAndActionOnly",
routeTemplate: "api/{controller}/{action}",
defaults: new { },
constraints: new { action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$" });


config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}

我可以为自己节省3个小时。

例如=> TestController

        [HttpGet]
public string TestMethod(int arg0)
{
return "";
}


[HttpGet]
public string TestMethod2(string arg0)
{
return "";
}


[HttpGet]
public string TestMethod3(int arg0,string arg1)
{
return "";
}

如果只能更改WebApiConfig.cs文件。

 config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/",
defaults: null
);

就是这样。

And Result: enter image description here < / p >

就我而言,一切都是对的

1) Web Config配置正确 2)路由前缀和路由属性正确

我还是得到了错误。在我的案例中,“Route”属性(通过按F12)指向System.Web.MVc,而不是System.Web.Http,这导致了问题。

你有没有试过:

[HttpGet("Summary")]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}


[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
return null;
}

你可以将[Route("api/[controller]/[action]")]添加到控制器类中。

[Route("api/[controller]/[action]")]
[ApiController]
public class MySuperController : ControllerBase
{
...
}