From 9571d6a814092d694ea905fd5371fa66280efbfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sj=C3=B6gren?= <58444816+bjornen77@users.noreply.github.com> Date: Mon, 24 Feb 2025 21:40:40 +0000 Subject: [PATCH 1/3] Fix RequestDelegate being chosen over Delegate in overload resolution Attempt to resolve the issue where the RequestDelegate overload is incorrectly preferred over the Delegate overload by using the new OverloadResolutionPriority attribute. --- .../Routing/src/Builder/EndpointRouteBuilderExtensions.cs | 8 ++++++++ .../src/Builder/FallbackEndpointRouteBuilderExtensions.cs | 3 ++- .../RouteShortCircuitEndpointRouteBuilderExtensions.cs | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs index aa745b1b9829..48c8194196de 100644 --- a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing.Patterns; @@ -227,6 +228,7 @@ static RequestDelegateResult CreateHandlerRequestDelegate(Delegate handler, Requ /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapGet( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -245,6 +247,7 @@ public static RouteHandlerBuilder MapGet( /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapPost( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -263,6 +266,7 @@ public static RouteHandlerBuilder MapPost( /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapPut( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -281,6 +285,7 @@ public static RouteHandlerBuilder MapPut( /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapDelete( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -299,6 +304,7 @@ public static RouteHandlerBuilder MapDelete( /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapPatch( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -338,6 +344,7 @@ public static RouteHandlerBuilder MapMethods( /// A that can be used to further customize the endpoint. [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder Map( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, @@ -413,6 +420,7 @@ public static RouteHandlerBuilder MapFallback(this IEndpointRouteBuilder endpoin /// [RequiresUnreferencedCode(MapEndpointUnreferencedCodeWarning)] [RequiresDynamicCode(MapEndpointDynamicCodeWarning)] + [OverloadResolutionPriority(1)] public static RouteHandlerBuilder MapFallback( this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, diff --git a/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs index bf8473679f89..7f739cea4283 100644 --- a/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Patterns; namespace Microsoft.AspNetCore.Builder; @@ -74,7 +75,7 @@ public static IEndpointConventionBuilder MapFallback( ArgumentNullException.ThrowIfNull(pattern); ArgumentNullException.ThrowIfNull(requestDelegate); - var conventionBuilder = endpoints.Map(pattern, requestDelegate); + var conventionBuilder = endpoints.Map(RoutePatternFactory.Parse(pattern), requestDelegate); conventionBuilder.WithDisplayName("Fallback " + pattern); conventionBuilder.Add(b => ((RouteEndpointBuilder)b).Order = int.MaxValue); conventionBuilder.WithMetadata(FallbackMetadata.Instance); diff --git a/src/Http/Routing/src/ShortCircuit/RouteShortCircuitEndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/ShortCircuit/RouteShortCircuitEndpointRouteBuilderExtensions.cs index e9e592706b1c..883915a17ea5 100644 --- a/src/Http/Routing/src/ShortCircuit/RouteShortCircuitEndpointRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/ShortCircuit/RouteShortCircuitEndpointRouteBuilderExtensions.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing.Patterns; namespace Microsoft.AspNetCore.Routing; @@ -34,7 +35,7 @@ public static IEndpointConventionBuilder MapShortCircuit(this IEndpointRouteBuil { route = $"{routePrefix}/{{**catchall}}"; } - group.Map(route, _shortCircuitDelegate) + group.Map(RoutePatternFactory.Parse(route), _shortCircuitDelegate) .ShortCircuit(statusCode) .Add(endpoint => { From e23360b56d21ab2a53cc75feadfcc4a50483a5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sj=C3=B6gren?= <58444816+bjornen77@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:00:49 +0000 Subject: [PATCH 2/3] fix failing tests --- .../src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs b/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs index 6e3c01498cd0..a4c03e410413 100644 --- a/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs +++ b/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs @@ -4,6 +4,7 @@ using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Options; @@ -68,6 +69,6 @@ private static IEndpointConventionBuilder MapHealthChecksCore(IEndpointRouteBuil .UseMiddleware(args) .Build(); - return endpoints.Map(pattern, pipeline).WithDisplayName(DefaultDisplayName); + return endpoints.Map(RoutePatternFactory.Parse(pattern), pipeline).WithDisplayName(DefaultDisplayName); } } From 011305bb0937f16093aad844225bd0428ecd0cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Sj=C3=B6gren?= <58444816+bjornen77@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:05:25 +0000 Subject: [PATCH 3/3] fix failing tests --- .../src/ConnectionEndpointRouteBuilderExtensions.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs index 8ed01395df6c..c922fb1457f4 100644 --- a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs +++ b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Http.Connections.Internal; using Microsoft.AspNetCore.Http.Timeouts; using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Patterns; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.Builder; @@ -99,7 +100,7 @@ public static ConnectionEndpointRouteBuilder MapConnections(this IEndpointRouteB app.Run(c => dispatcher.ExecuteNegotiateAsync(c, options)); var negotiateHandler = app.Build(); - var negotiateBuilder = endpoints.Map(pattern + "/negotiate", negotiateHandler); + var negotiateBuilder = endpoints.Map(RoutePatternFactory.Parse(pattern + "/negotiate"), negotiateHandler); conventionBuilders.Add(negotiateBuilder); // Add the negotiate metadata so this endpoint can be identified negotiateBuilder.WithMetadata(_negotiateMetadata); @@ -111,7 +112,7 @@ public static ConnectionEndpointRouteBuilder MapConnections(this IEndpointRouteB app.Run(c => dispatcher.ExecuteAsync(c, options, connectionDelegate)); var executehandler = app.Build(); - var executeBuilder = endpoints.Map(pattern, executehandler); + var executeBuilder = endpoints.Map(RoutePatternFactory.Parse(pattern), executehandler); executeBuilder.WithMetadata(new DisableRequestTimeoutAttribute()); conventionBuilders.Add(executeBuilder);