You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swagger UI序列化.NET 8 Minimal API对象失败问题求助

解决方案

问题根源

异常是因为Swagger生成Schema时,你的源生成AppJsonSerializerContext只注册了DomainData类型,但DomainData内部引用了DataTypeCode枚举,而这个枚举没有被添加到源生成上下文的JsonSerializable标记中,导致SwaggerGen找不到该类型的序列化元数据。另外,你之前修改UseSwaggerUI的配置没用,因为这个异常是后端生成swagger.json时抛出的,和UI层的序列化配置无关。

具体修复步骤

  1. 将枚举类型添加到源生成上下文
    修改AppJsonSerializerContext,把DataTypeCode枚举也加入JsonSerializable标记:

    [JsonSerializable(typeof(DomainData))]
    [JsonSerializable(typeof(NS.Models.Interfaces.DataTypeCode))]
    internal partial class AppJsonSerializerContext : JsonSerializerContext
    {
    }
    
  2. 配置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;
    });
    
  3. 移除无效的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:53:14