.NET 6 Web API如何在Swagger UI中显示OData响应内容类型?
解决方案
1. 完善OData配置并添加EDM模型
OData需要EDM模型来识别实体类型,同时要显式开启常用查询功能。修改Startup.cs(或Program.cs)中的OData配置:
services.AddControllers() .AddOData(options => { options.EnableQueryFeatures(100); // 开启OData核心查询能力 options.Select().Filter().OrderBy().Expand().Count().SetMaxTop(100); // 注册EDM模型并绑定路由前缀 options.AddRouteComponents("api", GetEdmModel()); });
补充EDM模型定义(可放在Startup/Program类中,或单独类文件):
private static IEdmModel GetEdmModel() { var builder = new ODataConventionModelBuilder(); builder.EntitySet<SubmissionSummaryDTO>("SubmissionSummaries"); return builder.GetEdmModel(); }
2. 配置Swagger识别OData媒体类型
在Swagger生成配置中,添加OData专属的媒体类型映射,确保操作过滤器能正确识别:
services.AddSwaggerGen(c => { // 为OData集合类型映射对应的媒体类型 c.MapType<List<SubmissionSummaryDTO>>(() => new OpenApiSchema { Type = "array", Items = new OpenApiSchema { Reference = new OpenApiReference { Type = ReferenceType.Schema, Id = "SubmissionSummaryDTO" } }, MediaType = "application/json;odata.metadata=minimal" }); // 启用自定义OData查询过滤器 c.OperationFilter<Controllers.EnableQueryFilter>(); });
3. 控制器显式指定Produces类型
在Action上添加[Produces]属性,明确声明支持的OData媒体类型:
[HttpGet] [Route("summary/odata")] [EnableQuery()] [Produces("application/json;odata.metadata=minimal", "application/json")] [ProducesResponseType(200, Type = typeof(List<SubmissionSummaryDTO>))] // 其他ProducesResponseType... public async Task<ActionResult<List<SubmissionSummaryDTO>>> GetSummaryOdata() { // 原有代码... }
如果需要为特定状态码单独指定内容类型,可扩展ProducesResponseType的ContentTypes参数:
[ProducesResponseType(200, Type = typeof(List<SubmissionSummaryDTO>), ContentTypes = new[] { "application/json;odata.metadata=minimal" })]
关于Swagger定义内容类型的说明
Swagger支持通过[Produces]属性全局声明Action的响应内容类型,也可以通过[ProducesResponseType]的ContentTypes参数为单个状态码指定专属的内容类型,两者配合就能让Swagger UI正确显示OData相关的响应头信息。
内容的提问来源于stack exchange,提问作者Mose
相关产品推荐
相关产品推荐

