当我尝试有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;
}
当前回答
我在尝试用额外的操作来增强我的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;
我在尝试用额外的操作来增强我的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调用的路由和对额外动作的调用。
我发现,当我有两个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 }
);
就我而言,一切都是对的
1) Web Config配置正确 2)路由前缀和路由属性正确
我还是得到了错误。在我的案例中,“Route”属性(通过按F12)指向System.Web.MVc,而不是System.Web.Http,这导致了问题。
经过大量的网络搜索,并试图找到最适合的形式的路由地图 如果发现了以下情况
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)