From d58517b455f1182b555e5cc4ad48cb2936f0221b Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Thu, 11 Jan 2024 18:01:52 -0600 Subject: [PATCH] Enable AOT compatibility for all libraries (#4871) * Enable AOT compatibility for all libraries (#4625) * Enable AOT compatibility for all libraries. Fix warnings. - Enable configuration binder source generator - The only library that can't use the ConfigBinder SG is the HeaderParsing library. - Blocked by https://github.com/dotnet/runtime/issues/94547 * Fix Compliance Redaction. * Explicitly reference Microsoft.Extensions.Configuration.Binder For all libraries that use the Configuration.Binder source generator, explicitly reference the NuGet package. This ensures we get the latest version (8.0.1), which has all the source generator fixes. * Respond to PR feedback. - Change ArgumentNullException to normal ArgumentException - Add tests to LoggingRedactionOptions collection setters to keep 100% code coverage. https://github.com/dotnet/runtime/issues/96873 causes these setters to no longer be called in the existing tests. --- Directory.Build.props | 6 --- src/Libraries/Directory.Build.props | 1 + ...ncyTelemetryServiceCollectionExtensions.cs | 6 --- .../HttpLoggingServiceCollectionExtensions.cs | 2 +- ...t.AspNetCore.Diagnostics.Middleware.csproj | 2 + .../Microsoft.AspNetCore.HeaderParsing.csproj | 2 + ...pplicationMetadataHostBuilderExtensions.cs | 7 ---- ...tionMetadataServiceCollectionExtensions.cs | 6 --- ...ensions.AmbientMetadata.Application.csproj | 5 +++ ...oft.Extensions.Compliance.Redaction.csproj | 2 + .../RedactionExtensions.cs | 6 --- .../FakeRedactionBuilderExtensions.cs | 4 -- ...osoft.Extensions.Compliance.Testing.csproj | 2 + .../AutoActivationExtensions.Keyed.cs | 12 +++--- .../AutoActivationExtensions.cs | 12 +++--- .../HttpExceptionSummaryProvider.cs | 10 +++++ ...ons.Diagnostics.HealthChecks.Common.csproj | 4 +- ...cs.HealthChecks.ResourceUtilization.csproj | 2 + ...esourceUtilizationHealthCheckExtensions.cs | 16 -------- .../KubernetesProbesExtensions.cs | 2 +- ...osoft.Extensions.Diagnostics.Probes.csproj | 2 + ...ions.Diagnostics.ResourceMonitoring.csproj | 2 + .../ResourceMonitoringBuilderExtensions.cs | 5 --- .../Logging/FakeLoggerBuilderExtensions.cs | 6 --- ...soft.Extensions.Diagnostics.Testing.csproj | 3 ++ .../HttpClientLatencyTelemetryExtensions.cs | 6 --- ...lientLoggingHttpClientBuilderExtensions.cs | 9 ----- ...lientLoggingServiceCollectionExtensions.cs | 5 --- ...crosoft.Extensions.Http.Diagnostics.csproj | 2 + ...StandardHedgingHandlerBuilderExtensions.cs | 9 +++-- ...icrosoft.Extensions.Http.Resilience.csproj | 5 +++ ...dardResiliencePipelineBuilderExtensions.cs | 9 +++-- .../ObjectPoolServiceCollectionExtensions.cs | 5 --- ...tionEnricherServiceCollectionExtensions.cs | 6 --- ...cessEnricherServiceCollectionExtensions.cs | 6 --- .../Latency/LatencyConsoleExtensions.cs | 6 --- .../Latency/LatencyContextExtensions.cs | 6 --- .../Microsoft.Extensions.Telemetry.csproj | 2 + .../HttpLoggingServiceExtensionsTests.cs | 39 +++++++++++++++++++ .../Hedging/StandardHedgingTests.cs | 4 +- ...tpClientBuilderExtensionsTests.Standard.cs | 2 +- 41 files changed, 113 insertions(+), 135 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 24c1bb96cae..cea28e22ade 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -90,12 +90,6 @@ $(MicrosoftCodeAnalysisCSharpVersion) - - - - - - diff --git a/src/Libraries/Directory.Build.props b/src/Libraries/Directory.Build.props index 518a00ad5b8..5dabc150a2c 100644 --- a/src/Libraries/Directory.Build.props +++ b/src/Libraries/Directory.Build.props @@ -4,6 +4,7 @@ $(NetCoreTargetFrameworks)$(ConditionalNet462) true + true true true diff --git a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Latency/RequestLatencyTelemetryServiceCollectionExtensions.cs b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Latency/RequestLatencyTelemetryServiceCollectionExtensions.cs index a6b7876fb8e..db2c76df323 100644 --- a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Latency/RequestLatencyTelemetryServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Latency/RequestLatencyTelemetryServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.AspNetCore.Diagnostics.Latency; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -64,11 +63,6 @@ public static IServiceCollection AddRequestLatencyTelemetry(this IServiceCollect /// Configuration of . /// The value of . /// Either or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, type: typeof(RequestLatencyTelemetryOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IServiceCollection AddRequestLatencyTelemetry(this IServiceCollection services, IConfigurationSection section) => Throw.IfNull(services) .Configure(Throw.IfNull(section)) diff --git a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Logging/HttpLoggingServiceCollectionExtensions.cs b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Logging/HttpLoggingServiceCollectionExtensions.cs index a8c6da4bd75..7de962db012 100644 --- a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Logging/HttpLoggingServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Logging/HttpLoggingServiceCollectionExtensions.cs @@ -60,7 +60,7 @@ public static IServiceCollection AddHttpLoggingRedaction(this IServiceCollection { _ = Throw.IfNull(section); - return services.AddHttpLoggingRedaction(section.Bind); + return services.AddHttpLoggingRedaction(o => section.Bind(o)); } /// diff --git a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Microsoft.AspNetCore.Diagnostics.Middleware.csproj b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Microsoft.AspNetCore.Diagnostics.Middleware.csproj index 89262b07f64..654e36f481f 100644 --- a/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Microsoft.AspNetCore.Diagnostics.Middleware.csproj +++ b/src/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware/Microsoft.AspNetCore.Diagnostics.Middleware.csproj @@ -8,6 +8,7 @@ $(NetCoreTargetFrameworks) + true true false false @@ -38,6 +39,7 @@ + diff --git a/src/Libraries/Microsoft.AspNetCore.HeaderParsing/Microsoft.AspNetCore.HeaderParsing.csproj b/src/Libraries/Microsoft.AspNetCore.HeaderParsing/Microsoft.AspNetCore.HeaderParsing.csproj index 1a37baabfdf..70cf5f0290f 100644 --- a/src/Libraries/Microsoft.AspNetCore.HeaderParsing/Microsoft.AspNetCore.HeaderParsing.csproj +++ b/src/Libraries/Microsoft.AspNetCore.HeaderParsing/Microsoft.AspNetCore.HeaderParsing.csproj @@ -8,6 +8,8 @@ $(NetCoreTargetFrameworks) + + false true true true diff --git a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataHostBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataHostBuilderExtensions.cs index 9ad46f152cb..e2635bbcc4d 100644 --- a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataHostBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataHostBuilderExtensions.cs @@ -2,8 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; -using Microsoft.Extensions.AmbientMetadata; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Shared.Diagnostics; @@ -25,11 +23,6 @@ public static class ApplicationMetadataHostBuilderExtensions /// The value of . /// is . /// is either , empty, or whitespace. - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ApplicationMetadata))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IHostBuilder UseApplicationMetadata(this IHostBuilder builder, string sectionName = DefaultSectionName) { _ = Throw.IfNull(builder); diff --git a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataServiceCollectionExtensions.cs index 3734d8686f4..bc08c2a60e9 100644 --- a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/ApplicationMetadataServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.AmbientMetadata; using Microsoft.Extensions.Configuration; using Microsoft.Shared.Diagnostics; @@ -21,11 +20,6 @@ public static class ApplicationMetadataServiceCollectionExtensions /// The configuration section to bind. /// The value of . /// or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ApplicationMetadata))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IServiceCollection AddApplicationMetadata(this IServiceCollection services, IConfigurationSection section) { _ = Throw.IfNull(services); diff --git a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/Microsoft.Extensions.AmbientMetadata.Application.csproj b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/Microsoft.Extensions.AmbientMetadata.Application.csproj index 615c7ec6e14..5cc014f22ca 100644 --- a/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/Microsoft.Extensions.AmbientMetadata.Application.csproj +++ b/src/Libraries/Microsoft.Extensions.AmbientMetadata.Application/Microsoft.Extensions.AmbientMetadata.Application.csproj @@ -5,6 +5,10 @@ Fundamentals + + true + + normal 100 @@ -15,6 +19,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Compliance.Redaction/Microsoft.Extensions.Compliance.Redaction.csproj b/src/Libraries/Microsoft.Extensions.Compliance.Redaction/Microsoft.Extensions.Compliance.Redaction.csproj index 9f9f4149ca1..286a14ca69e 100644 --- a/src/Libraries/Microsoft.Extensions.Compliance.Redaction/Microsoft.Extensions.Compliance.Redaction.csproj +++ b/src/Libraries/Microsoft.Extensions.Compliance.Redaction/Microsoft.Extensions.Compliance.Redaction.csproj @@ -7,6 +7,7 @@ true + true true true true @@ -25,6 +26,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Compliance.Redaction/RedactionExtensions.cs b/src/Libraries/Microsoft.Extensions.Compliance.Redaction/RedactionExtensions.cs index 191d8af6f55..577cd0e8d7a 100644 --- a/src/Libraries/Microsoft.Extensions.Compliance.Redaction/RedactionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Compliance.Redaction/RedactionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -45,11 +44,6 @@ public static IRedactionBuilder SetHmacRedactor(this IRedactionBuilder builder, /// The data classifications for which the redactor type should be used. /// The value of . /// , , or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(HmacRedactorOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IRedactionBuilder SetHmacRedactor(this IRedactionBuilder builder, IConfigurationSection section, params DataClassificationSet[] classifications) { _ = Throw.IfNull(builder); diff --git a/src/Libraries/Microsoft.Extensions.Compliance.Testing/FakeRedactionBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Compliance.Testing/FakeRedactionBuilderExtensions.cs index a954985c881..4c6314ec811 100644 --- a/src/Libraries/Microsoft.Extensions.Compliance.Testing/FakeRedactionBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Compliance.Testing/FakeRedactionBuilderExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Compliance.Redaction; using Microsoft.Extensions.Compliance.Testing; @@ -65,9 +64,6 @@ public static IRedactionBuilder SetFakeRedactor(this IRedactionBuilder builder, /// The data classifications for which the redactor type should be used. /// The value of . /// or is . - [UnconditionalSuppressMessage("Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "The type is FakeRedactorOptions and we know it.")] public static IRedactionBuilder SetFakeRedactor(this IRedactionBuilder builder, IConfigurationSection section, params DataClassificationSet[] classifications) { _ = Throw.IfNull(builder); diff --git a/src/Libraries/Microsoft.Extensions.Compliance.Testing/Microsoft.Extensions.Compliance.Testing.csproj b/src/Libraries/Microsoft.Extensions.Compliance.Testing/Microsoft.Extensions.Compliance.Testing.csproj index 1883b86af55..0da536c5c51 100644 --- a/src/Libraries/Microsoft.Extensions.Compliance.Testing/Microsoft.Extensions.Compliance.Testing.csproj +++ b/src/Libraries/Microsoft.Extensions.Compliance.Testing/Microsoft.Extensions.Compliance.Testing.csproj @@ -7,6 +7,7 @@ + true true true true @@ -24,6 +25,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.Keyed.cs b/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.Keyed.cs index 03a9f17810c..88a4d5d10e4 100644 --- a/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.Keyed.cs +++ b/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.Keyed.cs @@ -55,13 +55,9 @@ public static IServiceCollection ActivateKeyedSingleton( /// The type of the service to activate. /// An object used to uniquely identify the specific service. /// The value of . - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicallyAccessedMembers]")] public static IServiceCollection ActivateKeyedSingleton( this IServiceCollection services, - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type serviceType, + Type serviceType, object? serviceKey) { _ = Throw.IfNull(services); @@ -72,7 +68,7 @@ public static IServiceCollection ActivateKeyedSingleton( .AddOptions() .Configure(ao => { - var constructed = typeof(IEnumerable<>).MakeGenericType(serviceType); + var constructed = GetEnumerableServiceType(serviceType); if (ao.KeyedAutoActivators.Contains((constructed, serviceKey))) { return; @@ -85,6 +81,10 @@ public static IServiceCollection ActivateKeyedSingleton( } _ = ao.KeyedAutoActivators.Add((serviceType, serviceKey)); + + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:RequiresDynamicCode", + Justification = "When IsDynamicCodeSupported is not supported, DependencyInjection ensures IEnumerable service types are not a ValueType.")] + static Type GetEnumerableServiceType(Type serviceType) => typeof(IEnumerable<>).MakeGenericType(serviceType); }); return services; diff --git a/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.cs b/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.cs index 136a704ecfd..7b9c5c8a450 100644 --- a/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.DependencyInjection.AutoActivation/AutoActivationExtensions.cs @@ -55,11 +55,7 @@ public static IServiceCollection ActivateSingleton(this IServiceCollec /// The service collection containing the service. /// The type of the service to activate. /// The value of . - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicallyAccessedMembers]")] - public static IServiceCollection ActivateSingleton(this IServiceCollection services, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type serviceType) + public static IServiceCollection ActivateSingleton(this IServiceCollection services, Type serviceType) { _ = Throw.IfNull(services); _ = Throw.IfNull(serviceType); @@ -69,7 +65,7 @@ public static IServiceCollection ActivateSingleton(this IServiceCollection servi .AddOptions() .Configure(ao => { - var constructed = typeof(IEnumerable<>).MakeGenericType(serviceType); + var constructed = GetEnumerableServiceType(serviceType); if (ao.AutoActivators.Contains(constructed)) { return; @@ -82,6 +78,10 @@ public static IServiceCollection ActivateSingleton(this IServiceCollection servi } _ = ao.AutoActivators.Add(serviceType); + + [UnconditionalSuppressMessage("AotAnalysis", "IL3050:RequiresDynamicCode", + Justification = "When IsDynamicCodeSupported is not supported, DependencyInjection ensures IEnumerable service types are not a ValueType.")] + static Type GetEnumerableServiceType(Type serviceType) => typeof(IEnumerable<>).MakeGenericType(serviceType); }); return services; diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ExceptionSummarization/HttpExceptionSummaryProvider.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.ExceptionSummarization/HttpExceptionSummaryProvider.cs index fa31f2f2b5d..c6cd436a15d 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ExceptionSummarization/HttpExceptionSummaryProvider.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ExceptionSummarization/HttpExceptionSummaryProvider.cs @@ -35,9 +35,14 @@ static HttpExceptionSummaryProvider() }; var socketErrors = new Dictionary(); +#if NET5_0_OR_GREATER + foreach (var socketError in Enum.GetValues()) + { +#else foreach (var v in Enum.GetValues(typeof(SocketError))) { var socketError = (SocketError)v!; +#endif var name = socketError.ToString(); socketErrors[socketError] = descriptions.Count; @@ -45,9 +50,14 @@ static HttpExceptionSummaryProvider() } var webStatuses = new Dictionary(); +#if NET5_0_OR_GREATER + foreach (var status in Enum.GetValues()) + { +#else foreach (var v in Enum.GetValues(typeof(WebExceptionStatus))) { var status = (WebExceptionStatus)v!; +#endif var name = status.ToString(); webStatuses[status] = descriptions.Count; diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.Common/Microsoft.Extensions.Diagnostics.HealthChecks.Common.csproj b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.Common/Microsoft.Extensions.Diagnostics.HealthChecks.Common.csproj index 9d98141bfae..9109e0df176 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.Common/Microsoft.Extensions.Diagnostics.HealthChecks.Common.csproj +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.Common/Microsoft.Extensions.Diagnostics.HealthChecks.Common.csproj @@ -1,4 +1,4 @@ - + Microsoft.Extensions.Diagnostics.HealthChecks Health check implementations. @@ -6,6 +6,7 @@ + true true true true @@ -22,6 +23,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.csproj b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.csproj index dd73a1da586..183f4b21f41 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.csproj +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization.csproj @@ -6,6 +6,7 @@ + true true true @@ -21,6 +22,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/ResourceUtilizationHealthCheckExtensions.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/ResourceUtilizationHealthCheckExtensions.cs index e3b6c086605..ee5d466e0a3 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/ResourceUtilizationHealthCheckExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization/ResourceUtilizationHealthCheckExtensions.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Shared.Diagnostics; @@ -56,11 +55,6 @@ public static IHealthChecksBuilder AddResourceUtilizationHealthCheck(this IHealt /// Configuration for . /// The value of . /// or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ResourceUtilizationHealthCheckOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IHealthChecksBuilder AddResourceUtilizationHealthCheck( this IHealthChecksBuilder builder, IConfigurationSection section) @@ -80,11 +74,6 @@ public static IHealthChecksBuilder AddResourceUtilizationHealthCheck( /// A list of tags that can be used to filter health checks. /// The value of . /// , or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ResourceUtilizationHealthCheckOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IHealthChecksBuilder AddResourceUtilizationHealthCheck( this IHealthChecksBuilder builder, IConfigurationSection section, @@ -106,11 +95,6 @@ public static IHealthChecksBuilder AddResourceUtilizationHealthCheck( /// A list of tags that can be used to filter health checks. /// The value of . /// , or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ResourceUtilizationHealthCheckOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IHealthChecksBuilder AddResourceUtilizationHealthCheck( this IHealthChecksBuilder builder, IConfigurationSection section, diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/KubernetesProbesExtensions.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/KubernetesProbesExtensions.cs index 3663cef85d3..f4f60965655 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/KubernetesProbesExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/KubernetesProbesExtensions.cs @@ -33,7 +33,7 @@ public static IServiceCollection AddKubernetesProbes(this IServiceCollection ser _ = Throw.IfNull(services); _ = Throw.IfNull(section); - return services.AddKubernetesProbes(section.Bind); + return services.AddKubernetesProbes(o => section.Bind(o)); } /// diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/Microsoft.Extensions.Diagnostics.Probes.csproj b/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/Microsoft.Extensions.Diagnostics.Probes.csproj index 529a9c73fa2..b83ecbbd0fc 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/Microsoft.Extensions.Diagnostics.Probes.csproj +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.Probes/Microsoft.Extensions.Diagnostics.Probes.csproj @@ -6,6 +6,7 @@ + true true true true @@ -23,6 +24,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Microsoft.Extensions.Diagnostics.ResourceMonitoring.csproj b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Microsoft.Extensions.Diagnostics.ResourceMonitoring.csproj index e9ed2cd0e49..cbc5caad60a 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Microsoft.Extensions.Diagnostics.ResourceMonitoring.csproj +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/Microsoft.Extensions.Diagnostics.ResourceMonitoring.csproj @@ -7,6 +7,7 @@ true + true true true true @@ -32,6 +33,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringBuilderExtensions.cs index ca52cf38c74..43c926cdc81 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.ResourceMonitoring/ResourceMonitoringBuilderExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -39,10 +38,6 @@ public static IResourceMonitorBuilder ConfigureMonitor( /// The to use for configuring . /// The value of . /// Either or is . - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IResourceMonitorBuilder ConfigureMonitor( this IResourceMonitorBuilder builder, IConfigurationSection section) diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Logging/FakeLoggerBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Logging/FakeLoggerBuilderExtensions.cs index 2701205a496..00f05887aba 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Logging/FakeLoggerBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Logging/FakeLoggerBuilderExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -23,11 +22,6 @@ public static class FakeLoggerBuilderExtensions /// Logging builder. /// Configuration section that contains . /// Logging . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(FakeLogCollectorOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static ILoggingBuilder AddFakeLogging(this ILoggingBuilder builder, IConfigurationSection section) { _ = Throw.IfNull(builder); diff --git a/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Microsoft.Extensions.Diagnostics.Testing.csproj b/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Microsoft.Extensions.Diagnostics.Testing.csproj index 9ffe5557c0c..5bd030df5e9 100644 --- a/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Microsoft.Extensions.Diagnostics.Testing.csproj +++ b/src/Libraries/Microsoft.Extensions.Diagnostics.Testing/Microsoft.Extensions.Diagnostics.Testing.csproj @@ -7,9 +7,11 @@ + true true true true + $(NoWarn);SYSLIB1100;SYSLIB1101 @@ -23,6 +25,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/HttpClientLatencyTelemetryExtensions.cs b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/HttpClientLatencyTelemetryExtensions.cs index b682de95b21..309f24e1f2d 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/HttpClientLatencyTelemetryExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Latency/HttpClientLatencyTelemetryExtensions.cs @@ -2,13 +2,11 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Http; using Microsoft.Extensions.Http.Latency; using Microsoft.Extensions.Http.Latency.Internal; -using Microsoft.Extensions.Http.Logging; using Microsoft.Shared.Diagnostics; namespace Microsoft.Extensions.DependencyInjection; @@ -58,10 +56,6 @@ public static IServiceCollection AddHttpClientLatencyTelemetry(this IServiceColl /// The . /// The to use for configuring . /// The value of . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LoggingOptions))] - [UnconditionalSuppressMessage("Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IServiceCollection AddHttpClientLatencyTelemetry(this IServiceCollection services, IConfigurationSection section) { _ = Throw.IfNull(section); diff --git a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingHttpClientBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingHttpClientBuilderExtensions.cs index b867a767c68..24258bab36f 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingHttpClientBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingHttpClientBuilderExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -50,10 +49,6 @@ public static IHttpClientBuilder AddExtendedHttpClientLogging(this IHttpClientBu /// you have a way of viewing structured logs in order to view this extra information. /// /// Any of the arguments is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LoggingOptions))] - [UnconditionalSuppressMessage("Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IHttpClientBuilder AddExtendedHttpClientLogging(this IHttpClientBuilder builder, IConfigurationSection section) { _ = Throw.IfNull(builder); @@ -74,10 +69,6 @@ public static IHttpClientBuilder AddExtendedHttpClientLogging(this IHttpClientBu /// you have a way of viewing structured logs in order to view this extra information. /// /// Any of the arguments is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LoggingOptions))] - [UnconditionalSuppressMessage("Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IHttpClientBuilder AddExtendedHttpClientLogging(this IHttpClientBuilder builder, Action configure) { _ = Throw.IfNull(builder); diff --git a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingServiceCollectionExtensions.cs index e6e39b1b54b..748cdad5366 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Logging/HttpClientLoggingServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -58,10 +57,6 @@ public static IServiceCollection AddExtendedHttpClientLogging(this IServiceColle /// All other loggers are removed - including the default one, registered via . /// /// Any of the arguments is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LoggingOptions))] - [UnconditionalSuppressMessage("Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed with [DynamicDependency]")] public static IServiceCollection AddExtendedHttpClientLogging(this IServiceCollection services, IConfigurationSection section) { _ = Throw.IfNull(services); diff --git a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Microsoft.Extensions.Http.Diagnostics.csproj b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Microsoft.Extensions.Http.Diagnostics.csproj index 0ecc1a45bc3..223a370cd57 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Microsoft.Extensions.Http.Diagnostics.csproj +++ b/src/Libraries/Microsoft.Extensions.Http.Diagnostics/Microsoft.Extensions.Http.Diagnostics.csproj @@ -9,6 +9,7 @@ $(NoWarn);LA0006 + true true true false @@ -37,6 +38,7 @@ + diff --git a/src/Libraries/Microsoft.Extensions.Http.Resilience/Hedging/StandardHedgingHandlerBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Http.Resilience/Hedging/StandardHedgingHandlerBuilderExtensions.cs index 65edeb046fc..7e2b87c7315 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Resilience/Hedging/StandardHedgingHandlerBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Resilience/Hedging/StandardHedgingHandlerBuilderExtensions.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -25,13 +25,16 @@ public static class StandardHedgingHandlerBuilderExtensions /// The pipeline builder. /// The section that the options will bind against. /// The value of . - [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(HttpStandardHedgingResilienceOptions))] public static IStandardHedgingHandlerBuilder Configure(this IStandardHedgingHandlerBuilder builder, IConfigurationSection section) { _ = Throw.IfNull(builder); _ = Throw.IfNull(section); - var options = Throw.IfNull(section.Get()); + if (!section.GetChildren().Any()) + { + Throw.ArgumentException(nameof(section), "Configuration section cannot be empty."); + } + _ = builder.Services.Configure(builder.Name, section, o => o.ErrorOnUnknownConfiguration = true); return builder; diff --git a/src/Libraries/Microsoft.Extensions.Http.Resilience/Microsoft.Extensions.Http.Resilience.csproj b/src/Libraries/Microsoft.Extensions.Http.Resilience/Microsoft.Extensions.Http.Resilience.csproj index ac92ad2d833..7bf27efddb3 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Resilience/Microsoft.Extensions.Http.Resilience.csproj +++ b/src/Libraries/Microsoft.Extensions.Http.Resilience/Microsoft.Extensions.Http.Resilience.csproj @@ -6,6 +6,7 @@ + true true true true @@ -29,6 +30,10 @@ + + + + diff --git a/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/HttpStandardResiliencePipelineBuilderExtensions.cs b/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/HttpStandardResiliencePipelineBuilderExtensions.cs index d853e38ba20..e17e975f44b 100644 --- a/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/HttpStandardResiliencePipelineBuilderExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Http.Resilience/Resilience/HttpStandardResiliencePipelineBuilderExtensions.cs @@ -2,7 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; +using System.Linq; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -22,12 +22,15 @@ public static class HttpStandardResiliencePipelineBuilderExtensions /// The pipeline builder. /// The section that the options will bind against. /// The value of . - [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(HttpStandardResilienceOptions))] public static IHttpStandardResiliencePipelineBuilder Configure(this IHttpStandardResiliencePipelineBuilder builder, IConfigurationSection section) { _ = Throw.IfNull(builder); _ = Throw.IfNull(section); - var options = Throw.IfNull(section.Get()); + + if (!section.GetChildren().Any()) + { + Throw.ArgumentException(nameof(section), "Configuration section cannot be empty."); + } _ = builder.Services.Configure( builder.PipelineName, diff --git a/src/Libraries/Microsoft.Extensions.ObjectPool.DependencyInjection/ObjectPoolServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.ObjectPool.DependencyInjection/ObjectPoolServiceCollectionExtensions.cs index 25132dd1618..749b9578311 100644 --- a/src/Libraries/Microsoft.Extensions.ObjectPool.DependencyInjection/ObjectPoolServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.ObjectPool.DependencyInjection/ObjectPoolServiceCollectionExtensions.cs @@ -78,11 +78,6 @@ public static IServiceCollection ConfigurePool(this IServiceCollection /// The to add to. /// The configuration section to bind. /// The value of . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(DependencyInjectionPoolOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IServiceCollection ConfigurePools(this IServiceCollection services, IConfigurationSection section) { foreach (var child in Throw.IfNull(section).GetChildren()) diff --git a/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ApplicationEnricherServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ApplicationEnricherServiceCollectionExtensions.cs index dac5be34bf1..75bb01c4a8b 100644 --- a/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ApplicationEnricherServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ApplicationEnricherServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Diagnostics.Enrichment; using Microsoft.Shared.Diagnostics; @@ -62,11 +61,6 @@ public static IServiceCollection AddServiceLogEnricher(this IServiceCollection s .AddLogEnricherOptions(_ => { }, section); } - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ApplicationLogEnricherOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] private static IServiceCollection AddLogEnricherOptions( this IServiceCollection services, Action configure, diff --git a/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ProcessEnricherServiceCollectionExtensions.cs b/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ProcessEnricherServiceCollectionExtensions.cs index 51d235a05af..bb987eb90bb 100644 --- a/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ProcessEnricherServiceCollectionExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Telemetry/Enrichment/ProcessEnricherServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Diagnostics.Enrichment; using Microsoft.Shared.Diagnostics; @@ -64,11 +63,6 @@ public static IServiceCollection AddProcessLogEnricher(this IServiceCollection s .AddLogEnricherOptions(_ => { }, section); } - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(ProcessLogEnricherOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] private static IServiceCollection AddLogEnricherOptions( this IServiceCollection services, Action configure, diff --git a/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyConsoleExtensions.cs b/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyConsoleExtensions.cs index ba69f80ed0b..aea4a79bbcf 100644 --- a/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyConsoleExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyConsoleExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Diagnostics.Latency; @@ -56,11 +55,6 @@ public static IServiceCollection AddConsoleLatencyDataExporter(this IServiceColl /// Configuration of . /// The value of . /// Either or is . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LatencyConsoleOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IServiceCollection AddConsoleLatencyDataExporter(this IServiceCollection services, IConfigurationSection section) { _ = Throw.IfNull(services); diff --git a/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyContextExtensions.cs b/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyContextExtensions.cs index 749b5298229..5840da785d2 100644 --- a/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyContextExtensions.cs +++ b/src/Libraries/Microsoft.Extensions.Telemetry/Latency/LatencyContextExtensions.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Diagnostics.Latency; @@ -54,11 +53,6 @@ public static IServiceCollection AddLatencyContext(this IServiceCollection servi /// The dependency injection container. /// The configuration of . /// The value of . - [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor, typeof(LatencyContextOptions))] - [UnconditionalSuppressMessage( - "Trimming", - "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", - Justification = "Addressed by [DynamicDependency]")] public static IServiceCollection AddLatencyContext(this IServiceCollection services, IConfigurationSection section) { _ = Throw.IfNull(services); diff --git a/src/Libraries/Microsoft.Extensions.Telemetry/Microsoft.Extensions.Telemetry.csproj b/src/Libraries/Microsoft.Extensions.Telemetry/Microsoft.Extensions.Telemetry.csproj index 21e6baea697..95bb8c20fb2 100644 --- a/src/Libraries/Microsoft.Extensions.Telemetry/Microsoft.Extensions.Telemetry.csproj +++ b/src/Libraries/Microsoft.Extensions.Telemetry/Microsoft.Extensions.Telemetry.csproj @@ -14,6 +14,7 @@ true true true + true true @@ -31,6 +32,7 @@ + diff --git a/test/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware.Tests/Logging/HttpLoggingServiceExtensionsTests.cs b/test/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware.Tests/Logging/HttpLoggingServiceExtensionsTests.cs index 4f9eb15ca78..e480cefb1ed 100644 --- a/test/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware.Tests/Logging/HttpLoggingServiceExtensionsTests.cs +++ b/test/Libraries/Microsoft.AspNetCore.Diagnostics.Middleware.Tests/Logging/HttpLoggingServiceExtensionsTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using Microsoft.Extensions.Compliance.Classification; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Http.Diagnostics; @@ -50,5 +51,43 @@ public void AddHttpLogging_WhenConfiguredUsingConfigurationSection_IsCorrect() Assert.Contains("/path0toexclude", options.ExcludePathStartsWith); Assert.Contains("/path1toexclude", options.ExcludePathStartsWith); } + + [Fact] + public void AddHttpLogging_CanConfigureDataClasses() + { + var services = new ServiceCollection(); + services.AddHttpLoggingRedaction(o => + { + o.RouteParameterDataClasses = new Dictionary + { + { "one", new DataClassification("Taxonomy1", "Value1") }, + }; + + o.RequestHeadersDataClasses = new Dictionary + { + { "two", new DataClassification("Taxonomy2", "Value2") }, + }; + + o.ResponseHeadersDataClasses = new Dictionary + { + { "three", new DataClassification("Taxonomy3", "Value3") }, + }; + }); + + using var provider = services.BuildServiceProvider(); + var options = provider.GetRequiredService>().Value; + + Assert.Single(options.RouteParameterDataClasses); + Assert.Equal("Taxonomy1", options.RouteParameterDataClasses["one"].TaxonomyName); + Assert.Equal("Value1", options.RouteParameterDataClasses["one"].Value); + + Assert.Single(options.RequestHeadersDataClasses); + Assert.Equal("Taxonomy2", options.RequestHeadersDataClasses["two"].TaxonomyName); + Assert.Equal("Value2", options.RequestHeadersDataClasses["two"].Value); + + Assert.Single(options.ResponseHeadersDataClasses); + Assert.Equal("Taxonomy3", options.ResponseHeadersDataClasses["three"].TaxonomyName); + Assert.Equal("Value3", options.ResponseHeadersDataClasses["three"].Value); + } } #endif diff --git a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Hedging/StandardHedgingTests.cs b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Hedging/StandardHedgingTests.cs index cd53c4d00e2..7ded224a2e4 100644 --- a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Hedging/StandardHedgingTests.cs +++ b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Hedging/StandardHedgingTests.cs @@ -147,7 +147,7 @@ public void Configure_EmptyConfigurationSectionContent_ShouldThrow() { "dummy", "" } }).GetSection("dummy"); - Assert.Throws(() => + Assert.Throws(() => Builder.Configure(section)); } @@ -156,7 +156,7 @@ public void Configure_EmptyConfigurationSection_ShouldThrow() { var section = ConfigurationStubFactory.CreateEmpty().GetSection(string.Empty); - Assert.Throws(() => + Assert.Throws(() => Builder.Configure(section)); } diff --git a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Standard.cs b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Standard.cs index 0ca8b521c40..567cceb6466 100644 --- a/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Standard.cs +++ b/test/Libraries/Microsoft.Extensions.Http.Resilience.Tests/Resilience/HttpClientBuilderExtensionsTests.Standard.cs @@ -117,7 +117,7 @@ public void AddStandardResilienceHandler_NullConfigurationSectionContent_Throws( { var builder = new ServiceCollection().AddHttpClient("test"); - Assert.Throws(() => AddStandardResilienceHandler(mode, builder, _emptyConfigurationSection, options => { })); + Assert.Throws(() => AddStandardResilienceHandler(mode, builder, _emptyConfigurationSection, options => { })); } [InlineData(MethodArgs.Configuration)]