当我尝试有2个“Get”方法时,我一直得到这个错误
发现了多个与请求:webapi匹配的操作
我一直在看其他类似的问题,但我不明白。
我有2个不同的名字,并使用“HttpGet”属性
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}
[HttpGet]
public HttpResponseMessage FullDetails()
{
return null;
}
当我尝试有2个“Get”方法时,我一直得到这个错误
发现了多个与请求:webapi匹配的操作
我一直在看其他类似的问题,但我不明白。
我有2个不同的名字,并使用“HttpGet”属性
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}
[HttpGet]
public HttpResponseMessage FullDetails()
{
return null;
}
当前回答
在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 }
);
有可能你的webmethods被解析为相同的url。请浏览以下连结:-
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
所以,你可能需要将你的methodname添加到路由表中。
你有没有试过:
[HttpGet("Summary")]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}
[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
return null;
}
确保你没有装饰你的控制器方法默认的GET|PUT|POST|DELETE动作与[HttpPost/ PUT / GET / DELETE]属性。我已经将此属性添加到我的香草后控制器动作,它导致404。
希望这能帮助到一些人,因为它可能会非常令人沮丧,并导致进展停滞。