ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

Posted

技术标签:

【中文标题】ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异【英文标题】:Url matching difference in ASP.NET Web API vs ASP.NET Core 【发布时间】:2021-06-24 14:18:38 【问题描述】:

我试图找出这两个框架中 URL 匹配的不同之处

我知道以下对于 ASP.Net Web API 是正确的,想知道对于 ASP.NET 核心也是如此吗?

    如果没有明确指定,则用于派生 HTTP 方法的操作名称,例如

    public int GetById(int Id);

    这里没有指定 HTTP 方法,但由于约定,它只会匹配获取请求

    如果没有指定 HTTP 方法并且它也不能从动作名称派生,那么默认是 POST

    参数也参与匹配 URL ,如下所示

    // GET api/values/get
    public IEnumerable<string> Get()
    
        return new string[]  "value1", "value2" ;
    
    
    // GET api/values/get/5
    public string Get(int id)
    
        return "value";
    
    

    上述代码在 ASP.Net Web API 中运行良好,但在 ASP.NET Core 中出现以下异常

    AmbiguousActionException:匹配多个动作。

    ASP.Net Web API 路由

    ASP.Net CORE Web API 路由

    注意:我知道如何修复错误,想知道 ASP.Net Core 的 URL 匹配发生了什么变化 算法。

【问题讨论】:

请说明您在这两种情况下是如何配置路由的。 使用路线详情编辑问题 您使用的是哪个版本的 .Net core? UseMvc 已旧 (2.0)。 2.1,但我觉得当前版本的行为也会相同。 仅当您使用 url /api/values/get 时才会引发模棱两可的错误。实际上,asp.net core 中的这种新行为更有意义,我不太确定旧的 asp.net 是否与您可能错误地假设的不同。错误的假设无处不在。 【参考方案1】:

请查看this article,在 asp.net 核心应用程序中,常规路由通常用于控制器和视图,REST API 应使用属性路由。

如果您正在构建 API,则应将 [ApiController] 属性应用于您的控制器。除其他事项外,此属性需要对此类控制器类中的操作使用属性路由。 ASP.NET Core 中的属性路由在 ASP.NET MVC 和 Web API 中的行为类似。但是,除了支持 [Route] 属性之外,还可以将路由信息指定为 HTTP 方法属性的一部分:

[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase

    // GET: api/<TodoController>
    [HttpGet]
    public IEnumerable<string> Get()
    
        return new string[]  "value1", "value2" ;
    

如果要对 API 控制器和操作使用常规路由,则需要从 API 控制器中删除 [ApiController][Route] 属性,如果是这样,它将看起来像一个 MVC 控制器。

更多详细信息,请参阅Routing differences between ASP.NET MVC and ASP.NET Core。

然后,对于URL matching,在 asp.net 核心应用程序中,URL 匹配在一组可配置的阶段中运行。在每个阶段,输出是一组匹配项。下一阶段可以进一步缩小匹配范围。路由实现不保证匹配端点的处理顺序。一次处理所有可能的匹配。 URL 匹配阶段按以下顺序发生。 ASP.NET 核心:

    根据端点集及其路由模板处理 URL 路径,收集所有匹配项。 采用前面的列表并删除因应用路由约束而失败的匹配项。 采用前面的列表并删除未通过 MatcherPolicy 实例集的匹配项。 使用 EndpointSelector 从前面的列表中做出最终决定。

【讨论】:

以上是关于ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务与 ASP.NET Web Api

报错:ASP.NET Web API中找不到与请求匹配的HTTP资源

ASP.NET Web API 和身份与 Facebook 登录

ASP.NET Core Web API - PUT 与 PATCH

ASP.NET Web API路由系统:路由系统的几个核心类型

ASP.NET Web API模型验证以及异常处理方式