Swagger UI序列化.NET 8 Minimal API对象失败问题求助
解决方案
问题根源
异常是因为Swagger生成Schema时,你的源生成AppJsonSerializerContext只注册了DomainData类型,但DomainData内部引用了DataTypeCode枚举,而这个枚举没有被添加到源生成上下文的JsonSerializable标记中,导致SwaggerGen找不到该类型的序列化元数据。另外,你之前修改UseSwaggerUI的配置没用,因为这个异常是后端生成swagger.json时抛出的,和UI层的序列化配置无关。
具体修复步骤
将枚举类型添加到源生成上下文
修改AppJsonSerializerContext,把DataTypeCode枚举也加入JsonSerializable标记:[JsonSerializable(typeof(DomainData))] [JsonSerializable(typeof(NS.Models.Interfaces.DataTypeCode))] internal partial class AppJsonSerializerContext : JsonSerializerContext { }配置SwaggerGen使用源生成的序列化上下文
在AddSwaggerGen中指定Swagger生成Schema时使用你的源生成JsonSerializerOptions,确保它和API使用的序列化配置一致:builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Some API", Version = "v1" }); // 添加这行配置 c.JsonSerializerOptions.TypeInfoResolver = AppJsonSerializerContext.Default; });移除无效的UI层配置
之前在UseSwaggerUI中添加的JsonSerializerOptions配置可以删掉,因为它不影响后端Swagger Schema的生成:app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); options.RoutePrefix = string.Empty; // 删掉这段无用的配置 // options.JsonSerializerOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web) // { // TypeInfoResolver = AppJsonSerializerContext.Default // }; });
完整修改后的关键代码片段
var builder = WebApplication.CreateBuilder(args); builder.Services.ConfigureHttpJsonOptions(options => { options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default); }); builder.Services.AddSingleton<DomainDatasEndpoint>(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Some API", Version = "v1" }); // 配置SwaggerGen使用源生成的序列化上下文 c.JsonSerializerOptions.TypeInfoResolver = AppJsonSerializerContext.Default; }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseCors(); app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); options.RoutePrefix = string.Empty; }); } app.MapPost("/", async ([FromBody] DomainData domainData, [FromServices] DomainDatasEndpoint dataEndpoint) => await dataEndpoint.AddOrUpdateAsync(domainData)); [JsonSerializable(typeof(DomainData))] [JsonSerializable(typeof(NS.Models.Interfaces.DataTypeCode))] internal partial class AppJsonSerializerContext : JsonSerializerContext { }
内容的提问来源于stack exchange,提问作者TaskForce20
相关产品推荐
相关产品推荐

