我有以下路由规则:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new { id = @"\d+"}
);
带有这些操作的ProductController:
public Product Get(int id)
{
return _svc.GetProduct(id);
}
public int Post(Product p)
{
return 0;
}
我可以按预期调用Get
操作:获取“api / product / 2”
我以为我可以这样调用Post
行动: POST“api / product”
但它不起作用。我收到404错误。如果我这样做会有效: POST“api / product / 2”
我想通过设置id RouteParameter.Optional
的默认值,这意味着url的{id}部分不需要存在以匹配路由规则。但这似乎并没有发生。唯一的方法是制作另一个没有{id}部分到URL的规则吗?
答案 0 :(得分:5)
您需要将id
设为可以为空的,默认值为null
// doesn't work
public Product Get(int? id)
{
return _svc.GetProduct(id);
}
// works
public Product Get(int? id = null)
{
return _svc.GetProduct(id);
}
我大约95%确定这两个都在MVC下工作(当声明路由参数的可选时),但Web API更严格。
答案 1 :(得分:2)
我认为它没有按预期工作,因为你在id参数中添加了一个约束。有关相同的方案,请参阅此博文http://james.boelen.ca/programming/webapi-routes-optional-parameters-constraints/。