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 匹配差异的主要内容,如果未能解决你的问题,请参考以下文章
报错:ASP.NET Web API中找不到与请求匹配的HTTP资源
ASP.NET Web API 和身份与 Facebook 登录
ASP.NET Core Web API - PUT 与 PATCH