From f3072339de24621b279694b75cadb4526e14b87d Mon Sep 17 00:00:00 2001 From: David Fowler <davidfowl@gmail.com> Date: Sat, 2 Feb 2019 06:18:54 -0800 Subject: [PATCH] Handle null attributes in generated delegates (#7210) --- .../Builder/EndpointRouteBuilderExtensions.cs | 10 ++++++++-- ...EndpointDataSourceBuilderExtensionsTest.cs | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs index 6fa6d4db1cb..e3df5c72b6a 100644 --- a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs +++ b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs @@ -327,9 +327,15 @@ namespace Microsoft.AspNetCore.Builder }; // Add delegate attributes as metadata - foreach (var attribute in requestDelegate.Method.GetCustomAttributes()) + var attributes = requestDelegate.Method.GetCustomAttributes(); + + // This can be null if the delegate is a dynamic method or compiled from an expression tree + if (attributes != null) { - routeEndpointBuilder.Metadata.Add(attribute); + foreach (var attribute in attributes) + { + routeEndpointBuilder.Metadata.Add(attribute); + } } if (metadata != null) diff --git a/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs index ae53ec0427d..a002a54cec4 100644 --- a/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs +++ b/src/Http/Routing/test/UnitTests/Builder/MapEndpointEndpointDataSourceBuilderExtensionsTest.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; @@ -133,6 +134,25 @@ namespace Microsoft.AspNetCore.Builder Assert.IsType<Metadata>(endpointBuilder1.Metadata[2]); } + [Fact] + public void MapEndpoint_GeneratedDelegateWorks() + { + // Arrange + var builder = new DefaultEndpointRouteBuilder(); + + Expression<RequestDelegate> handler = context => Task.CompletedTask; + + // Act + var endpointBuilder = builder.Map(RoutePatternFactory.Parse("/"), "Display name!", handler.Compile(), new Metadata()); + + // Assert + var endpointBuilder1 = GetRouteEndpointBuilder(builder); + Assert.Equal("Display name!", endpointBuilder1.DisplayName); + Assert.Equal("/", endpointBuilder1.RoutePattern.RawText); + Assert.Equal(1, endpointBuilder1.Metadata.Count); + Assert.IsType<Metadata>(endpointBuilder1.Metadata[0]); + } + [Attribute1] [Attribute2] private static Task Handle(HttpContext context) => Task.CompletedTask; -- GitLab