WebApi 2.0 - 找到与请求匹配的多个操作

时间:2016-03-08 04:16:34

标签: asp.net-web-api2 asp.net-web-api-routing

我是WebApi的新手。使用.NET 4.5所以我猜这是Web Api 2.2

获取例外:找到与请求匹配的多个操作:浏览到/ api / categories / 33时,GetCategoriesById。

这样可以正常工作:/ api / categories

同时浏览到/ api / categories / 32 / subcategories会给出HTtp 404。

我的控制器:

public class CategoriesController : ApiController
{
    [Route("api/categories")]
    public IEnumerable<MainCategory> GetCategories()
    {
        return null;
    }

    [Route("api/categories/{id:int}")]
    public MainCategory GetCategoriesById(int Id)
    {
        return null;
    }

    [Route("api/categories/{id:int}/subcategories")]
    public IEnumerable<SubCategory> GetSubCategoriesById(int Id)
    {
        return null;
    }

}

WebApi已经退役了:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

        config.Routes.MapHttpRoute(
            name: "SubCategories",
            routeTemplate: "api/categories/{id}/subcategories",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d+" });

    }

2 个答案:

答案 0 :(得分:0)

这里使用MVC5可以进行属性路由,如果使用属性路由,则必须使用以下方式

[RoutePrefix("api/categories")]
    public class CategoriesController : ApiController
    {
        [Route("")]
        public IEnumerable<MainCategory> GetCategories()
        {
        return null;
    }

    [Route("/{id:int}")]
    public MainCategory GetCategoriesById(int Id)
    {
        return null;
    }

    [Route("/{id:int}/subcategories")]
    public IEnumerable<SubCategory> GetSubCategoriesById(int Id)
    {
        return null;
    }

}

public class CategoriesController : ApiController
{
    [Route("~api/categories")]
    public IEnumerable<MainCategory> GetCategories()
    {
        return null;
    }

    [Route("~api/categories/{id:int}")]
    public MainCategory GetCategoriesById(int Id)
    {
        return null;
    }

    [Route("~api/categories/{id:int}/subcategories")]
    public IEnumerable<SubCategory> GetSubCategoriesById(int Id)
    {
        return null;
    }

}

如果您愿意将其添加到路由表中,您还必须提供apicontroller名称和操作名称

答案 1 :(得分:0)

跳过属性路由并将路由表修改为

public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();   
        config.Routes.MapHttpRoute(
            name: "SubCategories",
            routeTemplate: "api/{Controller}/{id}/subcategories",
           new { action="GetSubCategoriesById", id=system.Web.Http.RouteParameter.Optional }

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

原因是默认应该是最后的。如果你把默认设置放在第一位,它就不会检查其余的代码,它会在你的api控制器中总是进入api控制器你有两个get方法。这就是错误背后的原因,你也没有在路由表中提供动作名称。