【问题标题】:How to override web api route on the same method with annotations如何使用注释在同一方法上覆盖 web api 路由
【发布时间】:2017-02-23 19:31:30
【问题描述】:

我在HttpConfiguration中有这个配置

config.Routes.MapHttpRoute("Default", "api/{controller}");
config.Routes.MapHttpRoute("Another", "api/{controller}/{action}");
config.Routes.MapHttpRoute("WithKey", "api/{controller}/{action}/{key}");

因此,我无法像这样访问我的控制器

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://&lt;host&gt;/api/products?productID=1,但我真的很想用这个网址访问http://&lt;host&gt;/api/products/1

我可以在 http 配置中添加新路由,但不能修改现有路由。而且我不想影响现有的控制器。

请问我该如何解决?

【问题讨论】:

    标签: c# web-services rest asp.net-web-api2 asp.net-web-api-routing


    【解决方案1】:

    首先确保在基于约定的路由之前启用属性路由。

    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);
        }
    }
    

    【讨论】:

    • 感谢您的回答。我应用了 MapHttpAttributRoutes()。然后我添加了注释。我只能请求 GetProducts,但仍然无法获取 api/products/1。我收到的消息:"{"Message":"找不到与请求 URI 'http:///api/products/1' 匹配的 HTTP 资源。","MessageDetail":"在与请求匹配的控制器“产品”。"}"
    • @MaximusDecimus,您是否在回答中建议的基于约定的路线之前添加了它?
    • 是的,我和答案一样
    • @MaximusDecimus,然后您将不得不展示更多有关如何配置应用程序的信息。问题中未显示的内容导致了问题。提供可用于重现问题的minimal reproducible example
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 2015-10-09
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多