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

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

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

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

    public int GetById(int Id);

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

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

  3. 参数也参与匹配 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 是否与您可能错误地假设的不同。错误的假设无处不在。

标签: c# asp.net-core asp.net-web-api asp.net-core-webapi asp.net-web-api-routing


【解决方案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 核心:

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

【讨论】:

    猜你喜欢
    • 2017-01-20
    • 2018-11-30
    • 2021-10-12
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多