当我尝试有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;
}
当前回答
我知道这是一个老问题,但有时,当你使用AngularJS中的服务资源连接到WebAPI时,确保你使用了正确的路由,否则会发生这个错误。
其他回答
我发现,当我有两个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添加到路由表中。
在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]属性。
从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时,确保你使用了正确的路由,否则会发生这个错误。