.NET Core 6如何全局设置ReadFromJsonAsync的JSON序列化选项
问题原因
你之前编写的Razor Pages JSON配置不生效,核心原因是配置作用域不匹配:builder.Services.AddRazorPages().AddJsonOptions() 仅负责配置Razor Pages/MVC框架自身处理入站请求模型绑定、出站响应序列化的规则,和HttpClient调用第三方API时使用的ReadFromJsonAsync、PostAsJsonAsync等扩展方法的序列化逻辑完全隔离,因此不会对HttpClient的JSON解析行为产生任何影响。
解决方案
方案1:全局配置Web场景默认JSON选项(推荐)
该配置会同时覆盖MVC/Razor Pages序列化、HttpClient JSON扩展方法的默认行为,一次配置全场景生效,无需修改业务代码。
在Program.cs中添加如下代码即可:
using System.Text.Json.Serialization; using Microsoft.AspNetCore.Http.Json; var builder = WebApplication.CreateBuilder(args); // 全局Web JSON序列化配置 builder.Services.Configure<JsonOptions>(options => { options.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.SerializerOptions.PropertyNameCaseInsensitive = true; }); // 保留你原有的其他服务注册代码,例如: builder.Services.AddRazorPages(); // 如果你使用Typed Client方式注入HttpClient,正常注册即可 builder.Services.AddHttpClient<IAuthService, AuthService>();
配置完成后,所有不传options参数的ReadFromJsonAsync、PostAsJsonAsync调用都会自动使用这套配置。
方案2:仅为HttpClient配置独立全局选项
如果你不希望修改MVC/Razor Pages本身的JSON序列化规则,仅需要调整HttpClient相关方法的序列化逻辑,可以通过自定义优先级更高的扩展方法实现,完全不侵入原有业务代码:
在项目中新增一个静态扩展类:
using System.Net.Http; using System.Net.Http.Json; using System.Text.Json; using System.Text.Json.Serialization; public static class GlobalHttpClientJsonExtensions { // 全局统一的HttpClient JSON序列化配置 private static readonly JsonSerializerOptions _httpClientJsonOptions = new() { Converters = { new JsonStringEnumConverter() }, PropertyNameCaseInsensitive = true }; /// <summary> /// 全局默认配置的ReadFromJsonAsync /// </summary> public static async Task<T?> ReadFromJsonAsync<T>(this HttpContent content, CancellationToken cancellationToken = default) { return await content.ReadFromJsonAsync<T>(_httpClientJsonOptions, cancellationToken); } /// <summary> /// 全局默认配置的PostAsJsonAsync /// </summary> public static async Task<HttpResponseMessage> PostAsJsonAsync<T>(this HttpClient client, string? requestUri, T value, CancellationToken cancellationToken = default) { return await client.PostAsJsonAsync(requestUri, value, _httpClientJsonOptions, cancellationToken); } // 如果你用到PutAsJsonAsync等其他JSON扩展方法,可以按相同逻辑补充 }
自定义扩展方法的优先级高于System.Net.Http.Json命名空间下的内置方法,你原有业务代码不需要做任何修改,所有调用会自动使用全局配置的选项。
内容的提问来源于stack exchange,提问作者bzmind
相关产品推荐
相关产品推荐

