【问题标题】:WebApi 2.0 - Multiple actions were found that match the requestWebApi 2.0 - 找到与请求匹配的多个操作
【发布时间】:2016-06-21 21:28:37
【问题描述】:

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

获取异常:找到与请求匹配的多个操作:GetCategoriesById on 当浏览到 /api/categories/33 时。

这很好用:/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+" });

    }

【问题讨论】:

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


    【解决方案1】:

    这里可以使用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 名称和操作名称

    【讨论】:

    • 对不起。那没有用。仍然找到与请求匹配的多个操作:GetCategoriesById。我已经尝试了您的两种实现方式。
    【解决方案2】:

    跳过属性路由,修改路由表为

    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 方法。这就是错误背后的原因,您也没有在路由表中提供操作名称。

    【讨论】:

    • 解决了一半的问题。我不再收到 Multiple Actions 错误,但在此处浏览时仍然收到 404:/api/categories/32/subcategories
    • 检查天气,您将获得 Localhost:your_port_number/help 中的所有 url 并检查天气,详细信息在每个 url 的导航中提供。如果您正确理解,控制器中的操作应该被触发跨度>
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2017-10-26
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多