diff --git a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs index 91a957e22cc7..7b8198e874ed 100644 --- a/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs +++ b/src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs @@ -188,7 +188,7 @@ private static Func ResolveFromRouteOrQuery(string pa """; public static string ResolveJsonBodyOrServiceMethod => """ - private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null) + private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonSerializerOptions jsonSerializerOptions, IServiceProviderIsService? serviceProviderIsService = null) { if (serviceProviderIsService is not null) { @@ -197,7 +197,7 @@ private static Func ResolveFromRouteOrQuery(string pa return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService())); } } - var jsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T)); + var jsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(T)); return (httpContext, isOptional) => TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true); } """; @@ -506,6 +506,7 @@ namespace Microsoft.AspNetCore.Http.Generated {{GeneratedCodeAttribute}} file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); {{GetVerbs(verbs)}} {{endpoints}} diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs index 1167c077070b..28022dd1c77b 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs @@ -115,7 +115,7 @@ static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter, } codeWriter.Write($@"var {parameter.SymbolName}_JsonBodyOrServiceResolver = "); var shortParameterTypeName = parameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat); - codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, jsonOptions, serviceProviderIsService);"); + codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, jsonSerializerOptions, serviceProviderIsService);"); } } } diff --git a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonPreparationEmitter.cs b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonPreparationEmitter.cs index b85eb97d62e2..7ae65fbe02aa 100644 --- a/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonPreparationEmitter.cs +++ b/src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonPreparationEmitter.cs @@ -8,13 +8,15 @@ internal static class EndpointJsonPreparationEmitter { internal static void EmitJsonPreparation(this Endpoint endpoint, CodeWriter codeWriter) { - codeWriter.WriteLine("var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions();"); - codeWriter.WriteLine($"var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));"); + codeWriter.WriteLine("var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions;"); + codeWriter.WriteLine("var jsonSerializerOptions = jsonOptions.SerializerOptions;"); + codeWriter.WriteLine("jsonSerializerOptions.MakeReadOnly();"); + codeWriter.WriteLine($"var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object));"); if (endpoint.Response?.IsSerializableJsonResponse(out var responseType) == true) { var typeName = responseType.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability); - codeWriter.WriteLine($"var responseJsonTypeInfo = (JsonTypeInfo<{responseType.ToDisplayString(NullableFlowState.MaybeNull, EmitterConstants.DisplayFormat)}>)jsonOptions.SerializerOptions.GetTypeInfo(typeof({typeName}));"); + codeWriter.WriteLine($"var responseJsonTypeInfo = (JsonTypeInfo<{responseType.ToDisplayString(NullableFlowState.MaybeNull, EmitterConstants.DisplayFormat)}>)jsonSerializerOptions.GetTypeInfo(typeof({typeName}));"); } foreach (var parameter in endpoint.Parameters) @@ -36,7 +38,7 @@ static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter) return; } var typeName = parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat); - codeWriter.WriteLine($"var {parameter.SymbolName}_JsonTypeInfo = (JsonTypeInfo<{typeName}>)jsonOptions.SerializerOptions.GetTypeInfo(typeof({parameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}));"); + codeWriter.WriteLine($"var {parameter.SymbolName}_JsonTypeInfo = (JsonTypeInfo<{typeName}>)jsonSerializerOptions.GetTypeInfo(typeof({parameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}));"); } } diff --git a/src/Http/Http.Extensions/src/JsonOptions.cs b/src/Http/Http.Extensions/src/JsonOptions.cs index bd7e8310a3dc..bfaf6856bf3f 100644 --- a/src/Http/Http.Extensions/src/JsonOptions.cs +++ b/src/Http/Http.Extensions/src/JsonOptions.cs @@ -23,8 +23,8 @@ public class JsonOptions // The JsonSerializerOptions.GetTypeInfo method is called directly and needs a defined resolver // setting the default resolver (reflection-based) but the user can overwrite it directly or by modifying - // the TypeInfoResolverChain - TypeInfoResolver = JsonSerializer.IsReflectionEnabledByDefault ? CreateDefaultTypeResolver() : null + // the TypeInfoResolverChain. Use JsonTypeInfoResolver.Combine() to produce an empty TypeInfoResolver. + TypeInfoResolver = JsonSerializer.IsReflectionEnabledByDefault ? CreateDefaultTypeResolver() : JsonTypeInfoResolver.Combine() }; // Use a copy so the defaults are not modified. diff --git a/src/Http/Http.Extensions/test/JsonOptionsTests.cs b/src/Http/Http.Extensions/test/JsonOptionsTests.cs index a28342fdbdf8..2f339976b420 100644 --- a/src/Http/Http.Extensions/test/JsonOptionsTests.cs +++ b/src/Http/Http.Extensions/test/JsonOptionsTests.cs @@ -12,7 +12,7 @@ public class JsonOptionsTests { [ConditionalFact] [RemoteExecutionSupported] - public void DefaultSerializerOptions_SetsTypeInfoResolverNull_WhenJsonIsReflectionEnabledByDefaultFalse() + public void DefaultSerializerOptions_SetsTypeInfoResolverEmptyResolver_WhenJsonIsReflectionEnabledByDefaultFalse() { var options = new RemoteInvokeOptions(); options.RuntimeConfigurationOptions.Add("System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault", false.ToString()); @@ -23,7 +23,8 @@ public void DefaultSerializerOptions_SetsTypeInfoResolverNull_WhenJsonIsReflecti var options = JsonOptions.DefaultSerializerOptions; // Assert - Assert.Null(options.TypeInfoResolver); + Assert.NotNull(options.TypeInfoResolver); + Assert.IsAssignableFrom(options.TypeInfoResolver); }, options); } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/HandlesEndpointsWithAndWithoutDiagnostics.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/HandlesEndpointsWithAndWithoutDiagnostics.generated.txt index 39b2d80ce892..a0388c6ec126 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/HandlesEndpointsWithAndWithoutDiagnostics.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/HandlesEndpointsWithAndWithoutDiagnostics.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 9, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt index 99ee5a11ab05..ccb938ec7ecf 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_NullableReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -82,8 +83,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -188,8 +191,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt index fd6c09799d43..1291c023f289 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_BindAsync_Snapshot.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -188,8 +191,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -281,8 +286,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -376,8 +383,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -469,8 +478,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -576,8 +587,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -669,8 +682,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -764,8 +779,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -857,8 +874,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -963,8 +982,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1055,8 +1076,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1149,8 +1172,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1241,8 +1266,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -1348,8 +1375,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -1441,8 +1470,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1547,8 +1578,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1639,8 +1672,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -1746,8 +1781,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var parameters = del.Method.GetParameters(); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -1839,8 +1876,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -1945,8 +1984,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt index 7ae06f23f2e8..9308b7872781 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitBodyParam_ComplexReturn_Snapshot.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -82,9 +83,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var todo_JsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -180,9 +183,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var todo_JsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var todo_JsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt index 208edf2fa3d7..af8a3debe034 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_ComplexTypeArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,9 +82,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt index 553f3be7b97b..23106300da17 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_NullableStringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,9 +82,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt index 5e0e93780800..fc559ae7e094 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitHeader_StringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,9 +82,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt index a8a702e87f55..4dfe6564a97f 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_ComplexTypeArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,9 +82,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt index 24ed483a9c29..79ef0f04ef7f 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_NullableStringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,9 +81,11 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.Int32 (global::System.String?[] arg0) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt index fefe20e6fedc..fe0fff0da4d2 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitQuery_StringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,9 +81,11 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.Int32 (global::System.String[] arg0) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt index 11ab3ea99117..75ffcfe1d4cf 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitServiceParam_SimpleReturn_Snapshot.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -175,8 +178,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -269,8 +274,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt index c0a9e7bb19f1..f2effadecbe8 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ExplicitSource_SimpleReturn_Snapshot.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -85,8 +86,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt index 75662b97fd8a..b328c0c32155 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_ComplexTypeArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,9 +82,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); var p_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("p", options.RouteParameterNames); if (options.EndpointBuilder.FilterFactories.Count > 0) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt index 5245bfb21543..7920d281cfd7 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,9 +95,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt index 5245bfb21543..7920d281cfd7 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,9 +95,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt index 5245bfb21543..7920d281cfd7 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,9 +95,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt index f58dbf9f92e3..fb0963b57444 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,9 +95,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt index 08a8d697a7dc..ca19d53c2cf1 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -95,11 +96,13 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var serviceProviderIsService = serviceProvider?.GetService(); - var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService); - var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService); + var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "Todo", "todo", jsonSerializerOptions, serviceProviderIsService); + var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TestService", "svc", jsonSerializerOptions, serviceProviderIsService); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -319,7 +322,7 @@ namespace Microsoft.AspNetCore.Http.Generated return (true, bodyValue); } - private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null) + private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonSerializerOptions jsonSerializerOptions, IServiceProviderIsService? serviceProviderIsService = null) { if (serviceProviderIsService is not null) { @@ -328,7 +331,7 @@ namespace Microsoft.AspNetCore.Http.Generated return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService())); } } - var jsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T)); + var jsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(T)); return (httpContext, isOptional) => TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true); } diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt index ce3bab934d11..290109594795 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleSpecialTypeParam_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt index 9aab48b14b27..0af76c61d49d 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_MultipleStringParam_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt index 01ad8867db35..18756a88e913 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_NoParam_StringReturn_WithFilter.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt index 01ad8867db35..18756a88e913 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsString_Has_Metadata.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt index 81018ac5c265..91e7079c9934 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsTodo_Has_Metadata.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,9 +81,11 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::Microsoft.AspNetCore.Http.Generators.Tests.Todo () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt index 6ee766701909..b1c7107e1ae6 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsValidationProblemResult_Has_Metadata.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::Microsoft.AspNetCore.Http.HttpResults.ValidationProblem () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt index c54618295a56..b9b8a2890223 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ReturnsVoid_Has_No_Metadata.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -79,8 +80,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, void () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt index 6d15a64cae17..46eee220fa3c 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleComplexTypeParam_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt index 1dc128dd1cb2..cc70fb7e27e8 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleEnumParam_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt index 796d1a94af51..c09d1e74d559 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_SingleNullableStringParam_WithEmptyQueryStringValueProvided_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt index 7b6479baa6e5..c437e7401640 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -97,10 +98,12 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var serviceProviderIsService = serviceProvider?.GetService(); - var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService); + var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonSerializerOptions, serviceProviderIsService); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -298,7 +301,7 @@ namespace Microsoft.AspNetCore.Http.Generated return (true, bodyValue); } - private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null) + private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonSerializerOptions jsonSerializerOptions, IServiceProviderIsService? serviceProviderIsService = null) { if (serviceProviderIsService is not null) { @@ -307,7 +310,7 @@ namespace Microsoft.AspNetCore.Http.Generated return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService())); } } - var jsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T)); + var jsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(T)); return (httpContext, isOptional) => TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true); } private static void PopulateMetadataForEndpoint(MethodInfo method, EndpointBuilder builder) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt index 0ffe0730d6ec..b77ab3122148 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Get_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods0( @@ -94,8 +95,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt index 0ffe0730d6ec..b77ab3122148 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndGet_WithArrayQueryString_AndBody_ShouldUseQueryString.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods0( @@ -94,8 +95,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 0ffe0730d6ec..b77ab3122148 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_PostAndPut_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods0( @@ -94,8 +95,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 0ffe0730d6ec..b77ab3122148 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapMethods_Post_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); [InterceptsLocation(@"TestMapActions.cs", 25, 13)] internal static RouteHandlerBuilder MapMethods0( @@ -94,8 +95,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt index 2ed34af264bd..c22c5ba860c8 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_AndBody_ShouldUseBody.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,8 +95,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt index 3dfb8363783e..5723abe946b9 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapPost_WithArrayQueryString_ShouldFail.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -94,9 +95,11 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); - var responseJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); + var responseJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(global::System.Int32)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt index 22f3d7d3cf6c..6fee45904e23 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_NoParam_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -168,8 +171,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.Threading.Tasks.Task () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -256,8 +261,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.Threading.Tasks.ValueTask () => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt index 38b6e8d3c3ca..d47e7e402a01 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/Multiple_MapAction_WithParams_StringReturn.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -80,8 +81,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -171,8 +174,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpResponse arg0) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -262,8 +267,10 @@ namespace Microsoft.AspNetCore.Http.Generated var handler = Cast(del, global::System.String (global::Microsoft.AspNetCore.Http.HttpRequest arg0, global::Microsoft.AspNetCore.Http.HttpResponse arg1) => throw null!); EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt index 6f50921f5678..6bb8bc91cda8 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/RequestDelegateValidateGeneratedFormCode.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; [InterceptsLocation(@"TestMapActions.cs", 29, 5)] @@ -82,8 +83,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt index 622137306336..6184bc259d40 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsDifferentInterceptorsFromSameLocation.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -81,8 +82,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -190,8 +193,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var age_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("age", options.RouteParameterNames); if (options.EndpointBuilder.FilterFactories.Count > 0) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt index 01064d6de92a..92e553936412 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/SupportsSameInterceptorsFromDifferentFiles.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; [InterceptsLocation(@"TestMapActions.cs", 25, 13)] @@ -83,8 +84,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var name_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("name", options.RouteParameterNames); if (options.EndpointBuilder.FilterFactories.Count > 0) diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt index 7c0142d1bddc..a9f7236544d3 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/VerifyAsParametersBaseline.generated.txt @@ -55,6 +55,7 @@ namespace Microsoft.AspNetCore.Http.Generated %GENERATEDCODEATTRIBUTE% file static class GeneratedRouteBuilderExtensionsCore { + private static readonly JsonOptions FallbackJsonOptions = new(); private static readonly string[] GetVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Get }; private static readonly string[] PatchVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Patch }; private static readonly string[] PostVerb = new[] { global::Microsoft.AspNetCore.Http.HttpMethods.Post }; @@ -83,8 +84,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -215,8 +218,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var Value_RouteOrQueryResolver = GeneratedRouteBuilderExtensionsCore.ResolveFromRouteOrQuery("Value", options.RouteParameterNames); if (options.EndpointBuilder.FilterFactories.Count > 0) @@ -340,8 +345,10 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -438,10 +445,12 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var serviceProviderIsService = serviceProvider?.GetService(); - var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonOptions, serviceProviderIsService); + var Todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "TodoStruct", "Todo", jsonSerializerOptions, serviceProviderIsService); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -556,10 +565,12 @@ namespace Microsoft.AspNetCore.Http.Generated EndpointFilterDelegate? filteredInvocation = null; var serviceProvider = options.ServiceProvider ?? options.EndpointBuilder.ApplicationServices; var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options); - var jsonOptions = serviceProvider?.GetService>()?.Value ?? new JsonOptions(); - var objectJsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object)); + var jsonOptions = serviceProvider?.GetService>()?.Value ?? FallbackJsonOptions; + var jsonSerializerOptions = jsonOptions.SerializerOptions; + jsonSerializerOptions.MakeReadOnly(); + var objectJsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(object)); var serviceProviderIsService = serviceProvider?.GetService(); - var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonOptions, serviceProviderIsService); + var Value_JsonBodyOrServiceResolver = ResolveJsonBodyOrService(logOrThrowExceptionHelper, "AddsCustomParameterMetadataAsProperty", "Value", jsonSerializerOptions, serviceProviderIsService); if (options.EndpointBuilder.FilterFactories.Count > 0) { @@ -771,7 +782,7 @@ namespace Microsoft.AspNetCore.Http.Generated return (true, bodyValue); } - private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null) + private static Func> ResolveJsonBodyOrService(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonSerializerOptions jsonSerializerOptions, IServiceProviderIsService? serviceProviderIsService = null) { if (serviceProviderIsService is not null) { @@ -780,7 +791,7 @@ namespace Microsoft.AspNetCore.Http.Generated return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService())); } } - var jsonTypeInfo = (JsonTypeInfo)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T)); + var jsonTypeInfo = (JsonTypeInfo)jsonSerializerOptions.GetTypeInfo(typeof(T)); return (httpContext, isOptional) => TryResolveBodyAsync(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true); } private static bool TryParseExplicit(string? s, IFormatProvider? provider, [MaybeNullWhen(returnValue: false)] out T result) where T: IParsable diff --git a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs index 617c64449370..9d1952102106 100644 --- a/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs +++ b/src/Http/Http.Extensions/test/RequestDelegateGenerator/CompileTimeCreationTests.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Http.RequestDelegateGenerator; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace Microsoft.AspNetCore.Http.Generators.Tests; @@ -358,4 +359,19 @@ public async Task MapAction_BindAsync_StructType() await VerifyResponseBodyAsync(httpContext, $"Hello {endpoint.DisplayName}!"); } } + + [Fact] + public async Task MapAction_NoJsonTypeInfoResolver_ThrowsException() + { + var source = """ +app.MapGet("/", () => "Hello world!"); +"""; + var (_, compilation) = await RunGeneratorAsync(source); + var serviceProvider = CreateServiceProvider(serviceCollection => + { + serviceCollection.ConfigureHttpJsonOptions(o => o.SerializerOptions.TypeInfoResolver = null); + }); + var exception = Assert.Throws(() => GetEndpointFromCompilation(compilation, serviceProvider: serviceProvider)); + Assert.Equal("JsonSerializerOptions instance must specify a TypeInfoResolver setting before being marked as read-only.", exception.Message); + } } diff --git a/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonOutputFormatter.cs b/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonOutputFormatter.cs index 35000cb21ae2..273b11d6f65d 100644 --- a/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonOutputFormatter.cs +++ b/src/Mvc/Mvc.Core/src/Formatters/SystemTextJsonOutputFormatter.cs @@ -23,8 +23,6 @@ public SystemTextJsonOutputFormatter(JsonSerializerOptions jsonSerializerOptions { SerializerOptions = jsonSerializerOptions; - // Use JsonTypeInfoResolver.Combine() to produce an empty TypeInfoResolver - jsonSerializerOptions.TypeInfoResolver ??= JsonTypeInfoResolver.Combine(); jsonSerializerOptions.MakeReadOnly(); SupportedEncodings.Add(Encoding.UTF8); diff --git a/src/Mvc/Mvc.Core/src/JsonOptions.cs b/src/Mvc/Mvc.Core/src/JsonOptions.cs index e777f86ee967..9bcf6663cf4d 100644 --- a/src/Mvc/Mvc.Core/src/JsonOptions.cs +++ b/src/Mvc/Mvc.Core/src/JsonOptions.cs @@ -41,8 +41,8 @@ public class JsonOptions // The JsonSerializerOptions.GetTypeInfo method is called directly and needs a defined resolver // setting the default resolver (reflection-based) but the user can overwrite it directly or by modifying - // the TypeInfoResolverChain - TypeInfoResolver = JsonSerializer.IsReflectionEnabledByDefault ? CreateDefaultTypeResolver() : null + // the TypeInfoResolverChain. Use JsonTypeInfoResolver.Combine() to produce an empty TypeInfoResolver. + TypeInfoResolver = JsonSerializer.IsReflectionEnabledByDefault ? CreateDefaultTypeResolver() : JsonTypeInfoResolver.Combine() }; private static IJsonTypeInfoResolver CreateDefaultTypeResolver() diff --git a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonOutputFormatterTest.cs b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonOutputFormatterTest.cs index d16ce19fb9da..f2811e843140 100644 --- a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonOutputFormatterTest.cs +++ b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonOutputFormatterTest.cs @@ -262,8 +262,8 @@ public void WriteResponseBodyAsync_Works_WhenTypeResolverIsNull() var jsonOptions = new JsonOptions(); jsonOptions.JsonSerializerOptions.TypeInfoResolver = null; - var stjOutputFormatter = SystemTextJsonOutputFormatter.CreateFormatter(jsonOptions); - Assert.IsAssignableFrom(stjOutputFormatter.SerializerOptions.TypeInfoResolver); + var exception = Assert.Throws(() => SystemTextJsonOutputFormatter.CreateFormatter(jsonOptions)); + Assert.Equal("JsonSerializerOptions instance must specify a TypeInfoResolver setting before being marked as read-only.", exception.Message); } [ConditionalTheory] diff --git a/src/Mvc/Mvc.Core/test/JsonOptionsTest.cs b/src/Mvc/Mvc.Core/test/JsonOptionsTest.cs index a60f1fdefa48..4f87bfdd679e 100644 --- a/src/Mvc/Mvc.Core/test/JsonOptionsTest.cs +++ b/src/Mvc/Mvc.Core/test/JsonOptionsTest.cs @@ -22,7 +22,8 @@ public void DefaultSerializerOptions_SetsTypeInfoResolverNull_WhenJsonIsReflecti var options = new JsonOptions().JsonSerializerOptions; // Assert - Assert.Null(options.TypeInfoResolver); + Assert.NotNull(options.TypeInfoResolver); + Assert.IsAssignableFrom(options.TypeInfoResolver); }, options); } diff --git a/src/Shared/Json/JsonSerializerExtensions.cs b/src/Shared/Json/JsonSerializerExtensions.cs index 36f823efbd56..7068649a63f5 100644 --- a/src/Shared/Json/JsonSerializerExtensions.cs +++ b/src/Shared/Json/JsonSerializerExtensions.cs @@ -18,8 +18,6 @@ public static bool ShouldUseWith(this JsonTypeInfo jsonTypeInfo, [NotNullWhen(fa public static JsonTypeInfo GetReadOnlyTypeInfo(this JsonSerializerOptions options, Type type) { - // Use JsonTypeInfoResolver.Combine() to produce an empty TypeInfoResolver - options.TypeInfoResolver ??= JsonTypeInfoResolver.Combine(); options.MakeReadOnly(); return options.GetTypeInfo(type); }