我是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+" });
}
答案 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方法。这就是错误背后的原因,你也没有在路由表中提供动作名称。