我在 HttpConfiguration 中有这个配置
config.Routes.MapHttpRoute("Default", "api/{controller}");
config.Routes.MapHttpRoute("Another", "api/{controller}/{action}");
config.Routes.MapHttpRoute("WithKey", "api/{controller}/{action}/{key}");
因此我无法像这样访问我的 Controller
http://<host>/api/products (works)
http://<host>/api/products/1 (doesn't work)
所以我在get方法中添加了注解Route但是不起作用
[RoutePrefix("products")]
public class ProductsController : ApiController
{
[HttpGet]
public IQueryable<IProduct> GetProducts()
{
return db.GetProducts();
}
//[Route("products/{productID}")] Tried. Doesn't work
//[Route("{productID:int}")] Tried. Doesn't work
[HttpGet]
public IProduct GetProduct(int productID)
{
return db.GetProduct(productID);
}
}
使其工作的唯一方法是输入这样的地址 http://<host>/api/products?productID=1
,但我真的想通过这个网址访问 http://<host>/api/products/1
。
我可以在 http 配置中添加新路由,但无法修改现有路由。而且我不想影响现有的 Controller 。
请问我该如何解决这个问题?
最佳答案
首先确保在基于约定的路由之前启用属性路由。
config.MapHttpAttributeRoutes();
//...convention-based routes.
config.Routes.MapHttpRoute("Default", "api/{controller}");
//...other code removed for brevity
接下来您要更新属性路由。
[RoutePrefix("api/products")]
public class ProductsController : ApiController {
//GET api/products
[HttpGet]
[Route("")]
public IQueryable<IProduct> GetProducts() {
return db.GetProducts();
}
//GET api/products/1
[HttpGet]
[Route("{productID:int}")]
public IProduct GetProduct(int productID) {
return db.GetProduct(productID);
}
}
关于c# - 如何使用注释覆盖同一方法上的 Web api 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42424577/