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

Asp.NET Core 7.0 Minimal API:为DateOnly指定正确的OpenAPI类型

在Asp.NET Core 7.0 Minimal API中为DateOnly参数添加Swagger Schema的format属性

问题场景

你在Minimal API中定义了接收DateOnly类型的查询参数接口,但默认生成的Swagger Schema仅标记为string类型,缺少符合OpenAPI规范的format: "date"属性。尝试用WithOpenApi直接替换Schema对象未生效。

解决方案1:修改现有Schema实例(单接口处理)

直接新建OpenApiSchema对象赋值会被Swagger的默认生成逻辑覆盖,正确做法是修改已存在的Schema实例的属性:

app.MapGet("/info", (DateOnly date) => $"Experimenting with APIs {date.ToString("yyyy-MM")}")
.WithOpenApi(o => {
    o.Summary = "Summary is added";
    var dateParam = o.Parameters[0];
    dateParam.Description = "Description is added";
    // 修改现有Schema的Format属性,而非新建对象
    dateParam.Schema.Format = "date";
    return o;
});

生成的Swagger JSON会包含预期的格式信息:

"parameters": [
{
  "name": "date",
  "in": "query",
  "description": "Description is added",
  "required": true,
  "style": "form",
  "schema": {
    "type": "string",
    "format": "date"
  }
}
]

解决方案2:全局配置(多接口统一处理)

如果多个接口都用到DateOnly,可以通过全局Schema过滤器统一配置,避免重复修改:

  1. 注册自定义Schema过滤器:
builder.Services.AddSwaggerGen(c =>
{
    c.SchemaFilter<DateOnlySchemaFilter>();
});

// 自定义Schema过滤器类
public class DateOnlySchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (context.Type == typeof(DateOnly))
        {
            schema.Type = "string";
            schema.Format = "date";
        }
    }
}
  1. 可选:添加JSON转换器优化参数解析体验
    为了让接口能正确解析前端传入的日期字符串,可配置DateOnly的JSON转换器:
builder.Services.Configure<JsonOptions>(options =>
{
    options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
});

// 自定义DateOnly JSON转换器
public class DateOnlyJsonConverter : JsonConverter<DateOnly>
{
    private const string DateFormat = "yyyy-MM-dd";

    public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateOnly.ParseExact(reader.GetString()!, DateFormat, CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString(DateFormat, CultureInfo.InvariantCulture));
    }
}

原理说明

直接新建OpenApiSchema赋值未生效,是因为Swagger生成文档时,会先基于参数类型生成默认Schema,后续的默认处理逻辑会覆盖你新建的Schema对象。而修改现有Schema实例的属性,会保留你的修改并最终写入Swagger JSON。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:13:17