1、问题

  最近将一个.net framework api 项目迁移到net core 3.1。其中有两个action是重载的,方法参数个数不一样。在.net framework下会自动根据请求参数个数进行路由匹配,但是在.net core3.1 下会报【The request matched multiple endpoints】异常。

 

2、问题查找

  异常的原因在于匹配的多个节点路由。遇到此问题我的第一反映,我重写匹配endpoints相关方法不就行了。带着这个思路我开始看相关的源码,看其是如何进行endpoints注册和匹配的。

  相关注册源码地址:

  https://github.com/aspnet/Routing/blob/master/src/Microsoft.AspNetCore.Routing/Builder/EndpointRoutingApplicationBuilderExtensions.cs

  https://github.com/dotnet/aspnetcore/blob/c925f99cddac0df90ed0bc4a07ecda6b054a0b02/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs

  https://github.com/dotnet/aspnetcore/blob/c925f99cddac0df90ed0bc4a07ecda6b054a0b02/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs#L10

  顺着代码看下GetRequiredService中都是实体类已经类是internal。这注册相关的代码好像不太好重写。

  那只能看匹配的相关代码试试。

  匹配相关源码地址:

  https://github.com/aspnet/Routing/blob/c28c7dea4e866ec5a0d33f0e290bc49baadb1c85/src/Microsoft.AspNetCore.Routing/EndpointRoutingMiddleware.cs

  https://github.com/aspnet/Routing/blob/c28c7dea4e866ec5a0d33f0e290bc49baadb1c85/src/Microsoft.AspNetCore.Routing/Matching/DfaMatcherFactory.cs#L9

  在DfaMatcherFactory中有一段代码:

  

 1 public override Matcher CreateMatcher(EndpointDataSource dataSource)
 2         {
 3             if (dataSource == null)
 4             {
 5                 throw new ArgumentNullException(nameof(dataSource));
 6             }
 7 
 8             return new DataSourceDependentMatcher(dataSource, () =>
 9             {
10                 return _services.GetRequiredService<DfaMatcherBuilder>();
11             });
12         }
View Code

相关文章: