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

.NET 9 OpenAPI文档生成异常:$ref引用不符合RFC3986规范

.NET 9 OpenAPI 生成无效引用导致验证失败问题

问题场景

使用.NET 9结合OpenApi和Scalar.AspNetCore构建API文档,模型类定义如下:

public class OrderResponse
{
    public string Id { get; set; }
    public decimal Amount { get; set; }
    public List<Transaction>? Transactions { get; set; }
    public List<Item> Items { get; set; }
}

public class Transaction
{
    public string Id { get; set; }
    public List<Item> Items { get; set; }
}

public class Item
{
    public string Id { get; set; }
}

控制器中创建返回OrderResponse的接口,代码编译正常,但在验证OpenAPI JSON文件时出现语义错误:

Semantic error at components.schemas.OrderResponse.properties.items.items.$ref
$ref values must be RFC3986-compliant percent-encoded URIs

查看生成的OpenAPI文件,发现items字段的引用路径异常:

{
    "items":  
    {
        "type": "array",
        "items": {
                     "$ref": "#/components/schemas/#/properties/transactions/items/properties/items/items"
                 }
    }
}

文档UI显示正常,但无法通过NSwag生成客户端代码。

问题原因

这是.NET 9 OpenAPI生成器在处理**多个嵌套类包含同名集合属性(Items)**时的路径生成bug,自动生成的$ref路径出现嵌套错误,生成了不符合RFC3986规范的无效URI,导致验证失败和客户端生成工具无法解析。

解决方法

方法1:自定义Schema ID生成策略

在Program.cs中配置SwaggerGen,使用类的完整名称作为Schema ID,避免命名冲突:

builder.Services.AddSwaggerGen(options =>
{
    options.CustomSchemaIds(type => type.FullName);
});

方法2:显式指定Schema名称

给每个模型类添加[SwaggerSchema]特性,明确指定Schema的标题:

using Microsoft.OpenApi.Models;

[SwaggerSchema(Title = "OrderResponse")]
public class OrderResponse
{
    public string Id { get; set; }
    public decimal Amount { get; set; }
    public List<Transaction>? Transactions { get; set; }
    public List<Item> Items { get; set; }
}

[SwaggerSchema(Title = "Transaction")]
public class Transaction
{
    public string Id { get; set; }
    public List<Item> Items { get; set; }
}

[SwaggerSchema(Title = "Item")]
public class Item
{
    public string Id { get; set; }
}

方法3:确保集合属性初始化

将可空集合属性改为非空并初始化,避免生成器处理可空类型时出现异常:

public class OrderResponse
{
    // ... 其他属性
    public List<Transaction> Transactions { get; set; } = [];
}

内容的提问来源于stack exchange,提问作者marius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:43:17