You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一控制器中创建OData与非OData端点

解决同一控制器中OData与非OData HttpGet端点的歧义匹配问题

错误原因

出现AmbiguousMatchException是因为两个HttpGet端点的路由模板完全一致(均为api/products),且方法签名无差异(无参数、返回类型相同),ASP.NET Core无法判定请求应匹配哪个端点。

解决方案

通过设置差异化路由路径区分两个端点,同时修改方法名避免C#类内的方法重复定义:

[Route("api/products")]
[ApiController]
public class ProductsController : ControllerBase
{
    private readonly IProductRepository _repo;

    // 构造函数注入仓储实例
    public ProductsController(IProductRepository repo)
    {
        _repo = repo;
    }

    // 支持OData的端点:路由为 api/products/odata
    [EnableQuery]
    [HttpGet("odata")]
    public IActionResult GetAllProductsOData()
    {
        var products = _repo.GetAllProducts();
        return Ok(products);
    }

    // 不支持OData的端点:路由为 api/products
    [HttpGet]
    public IActionResult GetAllProducts()
    {
        var products = _repo.GetAllProducts().ToList();
        return Ok(products);
    }
}

说明

  • 给OData支持的端点添加子路由odata,请求GET api/products/odata会触发OData接口,请求GET api/products会触发普通接口,路由区分清晰直观。
  • 修改OData端点方法名为GetAllProductsOData,避免与普通端点方法名冲突,符合C#类的方法定义规则。
  • 补充了仓储实例的构造函数注入逻辑(原代码中_repo未初始化),保证代码可正常运行。

内容的提问来源于stack exchange,提问作者Barry MSIH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:01:01