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

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

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

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

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

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

当前回答

我发现,当我有两个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 }
);

其他回答

我发现,当我有两个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 }
);

这是每个知道一切都是正确的并检查了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个小时。

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

经过大量的网络搜索,并试图找到最适合的形式的路由地图 如果发现了以下情况

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)

从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