From 39e72c28f701dfbecbc67a7dbf342eaf9d8fdbc5 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Thu, 16 Feb 2023 14:58:47 -0800 Subject: [PATCH 1/3] Remove JsonSerializerOptions copy in ProblemDetailsJsonOptionsSetup --- .../src/ProblemDetailsJsonOptionsSetup.cs | 19 +++++++----- ...mDetailsServiceCollectionExtensionsTest.cs | 30 +++++++++++++++---- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs b/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs index b2fd02ba260e..457d407635a9 100644 --- a/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs +++ b/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs @@ -11,15 +11,18 @@ internal sealed class ProblemDetailsJsonOptionsSetup : IPostConfigureOptions(); + break; + default: + break; } } } diff --git a/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs index 7b4e3ab437f2..538990f9f2c4 100644 --- a/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs +++ b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Text.Json.Serialization; +using System.Text.Json.Serialization.Metadata; using Microsoft.AspNetCore.Http.Json; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; @@ -103,7 +104,7 @@ public void AddProblemDetails_CombinesProblemDetailsContext() } [Fact] - public void AddProblemDetails_CombinesProblemDetailsContext_ForReadOnlyJsonOptions() + public void AddProblemDetails_Throws_ForReadOnlyJsonOptions() { // Arrange var collection = new ServiceCollection(); @@ -120,10 +121,7 @@ public void AddProblemDetails_CombinesProblemDetailsContext_ForReadOnlyJsonOptio var services = collection.BuildServiceProvider(); var jsonOptions = services.GetService>(); - Assert.NotNull(jsonOptions.Value); - Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver); - Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver.GetTypeInfo(typeof(ProblemDetails), jsonOptions.Value.SerializerOptions)); - Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver.GetTypeInfo(typeof(TypeA), jsonOptions.Value.SerializerOptions)); + Assert.Throws(() => jsonOptions.Value); } [Fact] @@ -166,6 +164,28 @@ public void AddProblemDetails_DoesNotCombineProblemDetailsContext_WhenNullTypeIn Assert.Null(jsonOptions.Value.SerializerOptions.TypeInfoResolver); } + [Fact] + public void AddProblemDetails_CombineProblemDetailsContext_WhenDefaultypeInfoResolver() + { + // Arrange + var collection = new ServiceCollection(); + collection.AddOptions(); + collection.ConfigureAll(options => options.SerializerOptions.TypeInfoResolver = new DefaultJsonTypeInfoResolver()); + + // Act + collection.AddProblemDetails(); + + // Assert + var services = collection.BuildServiceProvider(); + var jsonOptions = services.GetService>(); + + Assert.NotNull(jsonOptions.Value); + Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver); + Assert.IsNotType(jsonOptions.Value.SerializerOptions.TypeInfoResolver); + Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver.GetTypeInfo(typeof(ProblemDetails), jsonOptions.Value.SerializerOptions)); + Assert.NotNull(jsonOptions.Value.SerializerOptions.TypeInfoResolver.GetTypeInfo(typeof(TypeA), jsonOptions.Value.SerializerOptions)); + } + [JsonSerializable(typeof(TypeA))] internal partial class TestExtensionsJsonContext : JsonSerializerContext { } From 9dc1b3ea49b88a34e3cd62f69ee8bd0b7ef86810 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Fri, 17 Feb 2023 11:12:25 -0800 Subject: [PATCH 2/3] Adding comments --- .../src/ProblemDetailsJsonOptionsSetup.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs b/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs index 457d407635a9..a2ef31b611d3 100644 --- a/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs +++ b/src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs @@ -14,14 +14,19 @@ public void PostConfigure(string? name, JsonOptions options) switch (options.SerializerOptions.TypeInfoResolver) { case DefaultJsonTypeInfoResolver: - // Prepend our internal problem details context + // In this case, the current configuration is using a reflection-based resolver + // and we are prepending our internal problem details context to be evaluated + // first. options.SerializerOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine(ProblemDetailsJsonContext.Default, options.SerializerOptions.TypeInfoResolver); break; case not null: - // Combine the current resolver with our internal problem details context + // Combine the current resolver with our internal problem details context (adding last) options.SerializerOptions.AddContext(); break; default: + // Not adding our source gen context when TypeInfoResolver == null + // since adding it will skip the reflection-based resolver and potentially + // cause unexpected serialization problems break; } } From 463593bed0a6afe666bb9b0824a54a540772a5f6 Mon Sep 17 00:00:00 2001 From: Bruno Oliveira Date: Tue, 21 Feb 2023 15:03:27 -0800 Subject: [PATCH 3/3] Update src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs Co-authored-by: Brennan --- .../test/ProblemDetailsServiceCollectionExtensionsTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs index 538990f9f2c4..d19a27256cb1 100644 --- a/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs +++ b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs @@ -165,7 +165,7 @@ public void AddProblemDetails_DoesNotCombineProblemDetailsContext_WhenNullTypeIn } [Fact] - public void AddProblemDetails_CombineProblemDetailsContext_WhenDefaultypeInfoResolver() + public void AddProblemDetails_CombineProblemDetailsContext_WhenDefaultTypeInfoResolver() { // Arrange var collection = new ServiceCollection();