.NET Core 7中IOptions<MvcNewtonsoftJsonOptions>的注册位置在哪里?
MvcNewtonsoftJsonOptions 注册位置及自动存在的原因
核心触发原因:第三方依赖间接注册
你遇到的情况,大概率是NSwag或其他引入的第三方库在内部服务注册逻辑中,调用了AddNewtonsoftJson()方法,或是直接注册了MvcNewtonsoftJsonOptions相关配置服务,导致你未显式调用该方法的情况下,IOptions<MvcNewtonsoftJsonOptions>仍被注册。
具体注册逻辑位置
MvcNewtonsoftJsonOptions的注册逻辑封装在Microsoft.AspNetCore.Mvc.NewtonsoftJson包的MvcNewtonsoftJsonMvcBuilderExtensions.AddNewtonsoftJson()方法中,核心代码如下:
public static IMvcBuilder AddNewtonsoftJson(this IMvcBuilder builder, Action<MvcNewtonsoftJsonOptions> setupAction) { builder.Services.TryAddEnumerable(ServiceDescriptor.Transient<IConfigureOptions<MvcNewtonsoftJsonOptions>, MvcNewtonsoftJsonOptionsSetup>()); builder.Services.TryAddEnumerable(ServiceDescriptor.Transient<IPostConfigureOptions<MvcNewtonsoftJsonOptions>, MvcNewtonsoftJsonOptionsPostConfigure>()); if (setupAction != null) { builder.Services.Configure(setupAction); } return builder.AddJsonFormatters(); }
其中MvcNewtonsoftJsonOptionsSetup类负责初始化默认的MvcNewtonsoftJsonOptions实例,这也是你能通过IOptions<MvcNewtonsoftJsonOptions>获取到值的直接原因。
定位注册来源的验证方法
- 检查项目依赖树,确认是否有第三方库引用了
Microsoft.AspNetCore.Mvc.NewtonsoftJson包; - 在启动代码的
BuildServiceProvider()调用前,添加代码遍历已注册服务,查看IConfigureOptions<MvcNewtonsoftJsonOptions>的注册来源; - 查阅NSwag相关文档或源码,它在处理OpenAPI生成时通常会依赖NewtonsoftJson进行序列化,大概率是它触发了注册。
解决循环引用问题的建议
既然MvcNewtonsoftJsonOptions已被注册,你可以直接通过配置修改序列化规则来解决循环引用:
services.Configure<MvcNewtonsoftJsonOptions>(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; });
内容的提问来源于stack exchange,提问作者Simon_Weaver
相关产品推荐
相关产品推荐

