.NET 6中Swashbuckle多文件上传IOperationFilter配置报错求助
解决.NET 6 + Swashbuckle.AspNetCore 6.2.3中文件上传IOperationFilter的兼容性问题
在Swashbuckle.AspNetCore 6.x版本中,OpenAPI.NET类库做了破坏性变更,旧代码里依赖的Consumes集合和OpenApiParameter.Type属性已被移除,需按照OpenAPI 3.0规范调整代码,才能在Swagger页面生成正确的文件上传框。
修改后的完整FileUploadOperationFilter代码如下:
using Microsoft.AspNetCore.Mvc.ApiExplorer; using Swashbuckle.AspNetCore.SwaggerGen; using Microsoft.OpenApi.Models; namespace BK.DocumentService.Api.Swagger { public class FileUploadOperationFilter : IOperationFilter { public void Apply(OpenApiOperation operation, OperationFilterContext context) { if (operation.OperationId == "xxx") { // 替换原Consumes,用RequestBody定义multipart/form-data请求体 operation.RequestBody = new OpenApiRequestBody { Content = new Dictionary<string, OpenApiMediaType> { ["multipart/form-data"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["file"] = new OpenApiSchema { Type = "string", Format = "binary" // 指定为二进制文件类型 } }, Required = new HashSet<string> { "file" } } } } }; } } } }
关键变更说明:
- 替换
Consumes:OpenAPI 3.0不再使用Consumes,而是通过RequestBody.Content指定请求媒体类型,这里定义multipart/form-data类型的请求体,并在Schema中声明文件字段。 - 替换
Type = "file":OpenApiParameter.Type已被移除,需通过Schema属性定义类型,设置Type = "string"和Format = "binary"来标识这是一个文件参数。 - 推荐使用RequestBody:OpenAPI 3.0规范中,文件上传更推荐通过RequestBody定义,而非Parameters,这样Swagger UI会自动生成文件上传框。
注册过滤器
在Program.cs中配置SwaggerGen时,注册这个过滤器:
builder.Services.AddSwaggerGen(c => { // 其他Swagger配置... c.OperationFilter<FileUploadOperationFilter>(); });
内容的提问来源于stack exchange,提问作者MikeJ82
相关产品推荐
相关产品推荐

