|
3 | 3 | using Microsoft.IdentityModel.Tokens; |
4 | 4 | using Microsoft.OpenApi; |
5 | 5 | using Shared.Authorisation; |
| 6 | +using System; |
| 7 | +using System.Text.Json; |
| 8 | +using System.Text.Json.Serialization; |
| 9 | +using Shared.Serialisation; |
6 | 10 |
|
7 | 11 | namespace MessagingService.Bootstrapper |
8 | 12 | { |
@@ -50,6 +54,8 @@ public MiddlewareRegistry() { |
50 | 54 | RequestResponseMiddlewareLoggingConfig config = new(middlewareLogLevel, logRequests, logResponses); |
51 | 55 |
|
52 | 56 | this.AddSingleton(config); |
| 57 | + |
| 58 | + this.ConfigureHttpJsonOptions(jsonOptions => JsonSerializerConfiguration.ConfigureMinimalApi(jsonOptions.SerializerOptions)); |
53 | 59 | } |
54 | 60 |
|
55 | 61 | private void ConfigureAuthentication() { |
@@ -87,11 +93,11 @@ private void ConfigureAuthentication() { |
87 | 93 | this.AddClientCredentialsOnlyPolicy(); |
88 | 94 | this.AddClientCredentialsHandler(); |
89 | 95 |
|
90 | | - this.ConfigureHttpJsonOptions(options => |
91 | | - { |
92 | | - options.SerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy(); |
93 | | - options.SerializerOptions.PropertyNameCaseInsensitive = true; // optional, but safer |
94 | | - }); |
| 96 | + //this.ConfigureHttpJsonOptions(options => |
| 97 | + //{ |
| 98 | + // options.SerializerOptions.PropertyNamingPolicy = new SnakeCaseNamingPolicy(); |
| 99 | + // options.SerializerOptions.PropertyNameCaseInsensitive = true; // optional, but safer |
| 100 | + //}); |
95 | 101 | } |
96 | 102 | private void ConfigureSwagger() { |
97 | 103 |
|
@@ -127,3 +133,57 @@ private void ConfigureSwagger() { |
127 | 133 | } |
128 | 134 | } |
129 | 135 | } |
| 136 | + |
| 137 | +public static class JsonSerializerConfiguration |
| 138 | +{ |
| 139 | + public static void ConfigureMinimalApi(JsonSerializerOptions serializerOptions) |
| 140 | + { |
| 141 | + var defaultOptions = SystemTextJsonSerializer.GetDefaultJsonSerializerOptions(); |
| 142 | + serializerOptions.PropertyNamingPolicy = defaultOptions.PropertyNamingPolicy; |
| 143 | + serializerOptions.DictionaryKeyPolicy = defaultOptions.DictionaryKeyPolicy; |
| 144 | + serializerOptions.ReferenceHandler = defaultOptions.ReferenceHandler; |
| 145 | + serializerOptions.WriteIndented = defaultOptions.WriteIndented; |
| 146 | + serializerOptions.Converters.Add(new UtcDateTimeJsonConverter()); |
| 147 | + serializerOptions.Converters.Add(new NullableUtcDateTimeJsonConverter()); |
| 148 | + |
| 149 | + } |
| 150 | + |
| 151 | + private sealed class UtcDateTimeJsonConverter : System.Text.Json.Serialization.JsonConverter<DateTime> |
| 152 | + { |
| 153 | + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
| 154 | + { |
| 155 | + var value = reader.GetDateTime(); |
| 156 | + return value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime(); |
| 157 | + } |
| 158 | + |
| 159 | + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) |
| 160 | + { |
| 161 | + writer.WriteStringValue(value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime()); |
| 162 | + } |
| 163 | + } |
| 164 | + |
| 165 | + private sealed class NullableUtcDateTimeJsonConverter : System.Text.Json.Serialization.JsonConverter<DateTime?> |
| 166 | + { |
| 167 | + public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) |
| 168 | + { |
| 169 | + if (reader.TokenType == JsonTokenType.Null) |
| 170 | + { |
| 171 | + return null; |
| 172 | + } |
| 173 | + |
| 174 | + var value = reader.GetDateTime(); |
| 175 | + return value.Kind == DateTimeKind.Utc ? value : value.ToUniversalTime(); |
| 176 | + } |
| 177 | + |
| 178 | + public override void Write(Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options) |
| 179 | + { |
| 180 | + if (value.HasValue == false) |
| 181 | + { |
| 182 | + writer.WriteNullValue(); |
| 183 | + return; |
| 184 | + } |
| 185 | + |
| 186 | + writer.WriteStringValue(value.Value.Kind == DateTimeKind.Utc ? value.Value : value.Value.ToUniversalTime()); |
| 187 | + } |
| 188 | + } |
| 189 | +} |
0 commit comments