c# - 如何使用注释覆盖同一方法上的 Web api 路由

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

我在 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/

相关文章:

c# - .NET Winforms DataGridView - 任何嵌套方式?

c# - 从数组填充列表

java - Java 远程技术的优点 - Web 服务替代方案?

node.js - node-red - API 响应缓存

javascript - app android - 外部资源实现

c# - 访问 IEnumerable 的属性

C# 异步 Ping : not work from a Threading. 定时器

c# - 使用受 Citrix Access Gateway 保护的 Web 服务

c# - 我如何解决这个错误, "error while trying to deserialize parameter"

rest - 如何处理REST API中新对象属性的引入