Skip to content

Commit 3926560

Browse files
authored
Don't resolve service parameter types from JsonSerializer (#48930)
1 parent c7d58cd commit 3926560

18 files changed

+57
-26
lines changed

src/Http/Http.Extensions/gen/RequestDelegateGeneratorSources.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string pa
230230
""";
231231

232232
public static string ResolveJsonBodyOrServiceMethod => """
233-
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
233+
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
234234
{
235235
if (serviceProviderIsService is not null)
236236
{
@@ -239,6 +239,7 @@ private static Func<HttpContext, StringValues> ResolveFromRouteOrQuery(string pa
239239
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
240240
}
241241
}
242+
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
242243
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
243244
}
244245
""";

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointEmitter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter,
115115
}
116116
codeWriter.Write($@"var {parameter.SymbolName}_JsonBodyOrServiceResolver = ");
117117
var shortParameterTypeName = parameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
118-
codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, {parameter.SymbolName}_JsonTypeInfo, serviceProviderIsService);");
118+
codeWriter.WriteLine($"ResolveJsonBodyOrService<{parameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(logOrThrowExceptionHelper, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(parameter.SymbolName, true)}, jsonOptions, serviceProviderIsService);");
119119
}
120120
}
121121
}

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointJsonPreparationEmitter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ internal static void EmitJsonPreparation(this Endpoint endpoint, CodeWriter code
3131

3232
static void ProcessParameter(EndpointParameter parameter, CodeWriter codeWriter)
3333
{
34-
if (parameter.Source != EndpointParameterSource.JsonBody && parameter.Source != EndpointParameterSource.JsonBodyOrService && parameter.Source != EndpointParameterSource.JsonBodyOrQuery)
34+
if (parameter.Source != EndpointParameterSource.JsonBody)
3535
{
3636
return;
3737
}

src/Http/Http.Extensions/gen/StaticRouteHandlerModel/Emitters/EndpointParameterEmitter.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ internal static void EmitJsonBodyOrQueryParameterPreparationString(this Endpoint
246246
var shortParameterTypeName = endpointParameter.Type.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
247247
var assigningCode = $"await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<{endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>(httpContext, logOrThrowExceptionHelper, {(endpointParameter.IsOptional ? "true" : "false")}, {SymbolDisplay.FormatLiteral(shortParameterTypeName, true)}, {SymbolDisplay.FormatLiteral(endpointParameter.SymbolName, true)}, {endpointParameter.SymbolName}_JsonTypeInfo)";
248248
var resolveBodyResult = $"{endpointParameter.SymbolName}_resolveBodyResult";
249+
codeWriter.WriteLine($"var {endpointParameter.SymbolName}_JsonTypeInfo = (JsonTypeInfo<{endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormat)}>)jsonOptions.SerializerOptions.GetTypeInfo(typeof({endpointParameter.Type.ToDisplayString(EmitterConstants.DisplayFormatWithoutNullability)}));");
249250
codeWriter.WriteLine($"var {resolveBodyResult} = {assigningCode};");
250251
codeWriter.WriteLine($"{endpointParameter.EmitHandlerArgument()} = {resolveBodyResult}.Item2!;");
251252

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam.generated.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
127127
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
128128
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
129129
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
130-
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
131130

132131
if (options.EndpointBuilder.FilterFactories.Count > 0)
133132
{
@@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
155154
}
156155
else
157156
{
157+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
158158
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
159159
p_local = p_resolveBodyResult.Item2!;
160160
if (!p_resolveBodyResult.Item1)
@@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
184184
}
185185
else
186186
{
187+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
187188
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
188189
p_local = p_resolveBodyResult.Item2!;
189190
if (!p_resolveBodyResult.Item1)

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_EmptyQueryValues.generated.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
127127
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
128128
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
129129
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
130-
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
131130

132131
if (options.EndpointBuilder.FilterFactories.Count > 0)
133132
{
@@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
155154
}
156155
else
157156
{
157+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
158158
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
159159
p_local = p_resolveBodyResult.Item2!;
160160
if (!p_resolveBodyResult.Item1)
@@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
184184
}
185185
else
186186
{
187+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
187188
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
188189
p_local = p_resolveBodyResult.Item2!;
189190
if (!p_resolveBodyResult.Item1)

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_NullableStringArrayParam_QueryNotPresent.generated.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
127127
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
128128
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
129129
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
130-
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
131130

132131
if (options.EndpointBuilder.FilterFactories.Count > 0)
133132
{
@@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
155154
}
156155
else
157156
{
157+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
158158
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
159159
p_local = p_resolveBodyResult.Item2!;
160160
if (!p_resolveBodyResult.Item1)
@@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
184184
}
185185
else
186186
{
187+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String?[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
187188
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String?[]>(httpContext, logOrThrowExceptionHelper, false, "string?[]", "p", p_JsonTypeInfo);
188189
p_local = p_resolveBodyResult.Item2!;
189190
if (!p_resolveBodyResult.Item1)

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_ImplicitQuery_StringArrayParam.generated.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ namespace Microsoft.AspNetCore.Http.Generated
127127
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
128128
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
129129
var responseJsonTypeInfo = (JsonTypeInfo<global::System.Int32>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.Int32));
130-
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
131130

132131
if (options.EndpointBuilder.FilterFactories.Count > 0)
133132
{
@@ -155,6 +154,7 @@ namespace Microsoft.AspNetCore.Http.Generated
155154
}
156155
else
157156
{
157+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
158158
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
159159
p_local = p_resolveBodyResult.Item2!;
160160
if (!p_resolveBodyResult.Item1)
@@ -184,6 +184,7 @@ namespace Microsoft.AspNetCore.Http.Generated
184184
}
185185
else
186186
{
187+
var p_JsonTypeInfo = (JsonTypeInfo<global::System.String[]>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::System.String[]));
187188
var p_resolveBodyResult = await GeneratedRouteBuilderExtensionsCore.TryResolveBodyAsync<global::System.String[]>(httpContext, logOrThrowExceptionHelper, false, "string[]", "p", p_JsonTypeInfo);
188189
p_local = p_resolveBodyResult.Item2!;
189190
if (!p_resolveBodyResult.Item1)

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_JsonBodyOrService_HandlesBothJsonAndService.generated.txt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,9 @@ namespace Microsoft.AspNetCore.Http.Generated
127127
var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
128128
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
129129
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
130-
var todo_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.Todo));
131-
var svc_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.TestService));
132130
var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
133-
var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", todo_JsonTypeInfo, serviceProviderIsService);
134-
var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", svc_JsonTypeInfo, serviceProviderIsService);
131+
var todo_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.Todo>(logOrThrowExceptionHelper, "Todo", "todo", jsonOptions, serviceProviderIsService);
132+
var svc_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.TestService>(logOrThrowExceptionHelper, "TestService", "svc", jsonOptions, serviceProviderIsService);
135133

136134
if (options.EndpointBuilder.FilterFactories.Count > 0)
137135
{
@@ -339,7 +337,7 @@ namespace Microsoft.AspNetCore.Http.Generated
339337

340338
return (true, bodyValue);
341339
}
342-
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
340+
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
343341
{
344342
if (serviceProviderIsService is not null)
345343
{
@@ -348,6 +346,7 @@ namespace Microsoft.AspNetCore.Http.Generated
348346
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
349347
}
350348
}
349+
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
351350
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
352351
}
353352

src/Http/Http.Extensions/test/RequestDelegateGenerator/Baselines/MapAction_TakesCustomMetadataEmitter_Has_Metadata.generated.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,8 @@ namespace Microsoft.AspNetCore.Http.Generated
129129
var logOrThrowExceptionHelper = new LogOrThrowExceptionHelper(serviceProvider, options);
130130
var jsonOptions = serviceProvider?.GetService<IOptions<JsonOptions>>()?.Value ?? new JsonOptions();
131131
var objectJsonTypeInfo = (JsonTypeInfo<object?>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(object));
132-
var x_JsonTypeInfo = (JsonTypeInfo<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter));
133132
var serviceProviderIsService = serviceProvider?.GetService<IServiceProviderIsService>();
134-
var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", x_JsonTypeInfo, serviceProviderIsService);
133+
var x_JsonBodyOrServiceResolver = ResolveJsonBodyOrService<global::Microsoft.AspNetCore.Http.Generators.Tests.CustomMetadataEmitter>(logOrThrowExceptionHelper, "CustomMetadataEmitter", "x", jsonOptions, serviceProviderIsService);
135134

136135
if (options.EndpointBuilder.FilterFactories.Count > 0)
137136
{
@@ -317,7 +316,7 @@ namespace Microsoft.AspNetCore.Http.Generated
317316

318317
return (true, bodyValue);
319318
}
320-
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonTypeInfo<T> jsonTypeInfo, IServiceProviderIsService? serviceProviderIsService = null)
319+
private static Func<HttpContext, bool, ValueTask<(bool, T?)>> ResolveJsonBodyOrService<T>(LogOrThrowExceptionHelper logOrThrowExceptionHelper, string parameterTypeName, string parameterName, JsonOptions jsonOptions, IServiceProviderIsService? serviceProviderIsService = null)
321320
{
322321
if (serviceProviderIsService is not null)
323322
{
@@ -326,6 +325,7 @@ namespace Microsoft.AspNetCore.Http.Generated
326325
return static (httpContext, isOptional) => new ValueTask<(bool, T?)>((true, httpContext.RequestServices.GetService<T>()));
327326
}
328327
}
328+
var jsonTypeInfo = (JsonTypeInfo<T>)jsonOptions.SerializerOptions.GetTypeInfo(typeof(T));
329329
return (httpContext, isOptional) => TryResolveBodyAsync<T>(httpContext, logOrThrowExceptionHelper, isOptional, parameterTypeName, parameterName, jsonTypeInfo, isInferred: true);
330330
}
331331
private static void PopulateMetadataForEndpoint<T>(MethodInfo method, EndpointBuilder builder)

0 commit comments

Comments
 (0)