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 }