Swagger UI 不会为多部分请求中的部分传递 content-type
Swagger UI doesn't pass content-type for a part within a multipart request
我正在使用以下代码配置 ASP.NET Core 3.1 控制器方法来上传包含 2 个部分的多部分请求,一个名为 "metadata" 以包含一个 JSON 模型,另一个名为 "file" 的部分包含实际的二进制文件。 Swagger UI 似乎可以正确呈现,但是在调用该操作时,它永远不会为我的元数据部分发送 "content-type"。
调试我的控制器方法时,文件二进制部分很好,包括 "content-type" header 但是当我检查元数据部分的 header 时,"content-type" header 丢失。我收到的元数据部分的唯一 header 是 "content-disposition".
我确认 swagger.json 正确显示 "application/json" 作为元数据部分的 content-type。
目前我正在使用 Swashbuckle.AspNetCore v5.0.0-rc4
我是否遗漏了操作筛选器中的任何内容或其他任何内容?
public class FileUploadOperationFilter : IOperationFilter
{
public virtual void Apply(OpenApiOperation operation, OperationFilterContext context)
{
context?.MethodInfo?.GetCustomAttribute<FileUploadOperationAttribute>()?.Apply(operation, context);
}
}
[AttributeUsage(AttributeTargets.Method)]
public class FileUploadOperationAttribute : Attribute
{
public Type MetadataType { get; }
public string MetadataPropertyName { get; set; } = "metadata";
public string FilePropertyName { get; set; } = "file";
public FileUploadOperationAttribute(Type metadataType)
{
MetadataType = metadataType;
}
public virtual void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation == null || context == null)
return;
var metadataSchema = context.SchemaGenerator.GenerateSchema(
MetadataType,
context.SchemaRepository);
operation.RequestBody = new OpenApiRequestBody
{
Content = new Dictionary<string, OpenApiMediaType>
{
["multipart/form-data"] = new OpenApiMediaType
{
Schema = new OpenApiSchema
{
Type = "object",
Properties = new Dictionary<string, OpenApiSchema>
{
[MetadataPropertyName] = metadataSchema,
[FilePropertyName] = new OpenApiSchema
{
Type = "string",
Format = "binary",
},
},
},
Encoding = new Dictionary<string, OpenApiEncoding>
{
[MetadataPropertyName] = new OpenApiEncoding
{
ContentType = "application/json",
},
},
}
},
};
}
}
[HttpPut("{fileName}/versions/{version}/content")]
[FileUploadOperation(typeof(SubmitFileRequest))]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(GenericActionResponse), StatusCodes.Status404NotFound)]
public async Task<IActionResult> SubmitFileVersionContentAsync([FromRoute] string fileName, [FromRoute] string version, CancellationToken cancellationToken)
{
// code omitted for brevity...
}
public class SubmitFileRequest
{
[Required]
public DateTime CreationTimeUtc { get; set; }
[Required]
public DateTime LastWriteTimeUtc { get; set; }
[Required]
public string InstallMethod { get; set; }
}
这是 Swagger UI 的一个问题 – 目前(截至 2019 年 12 月)它没有将 Content-Type
header 添加到 multipart/*
中的 JSON 数据] 要求。问题在此处跟踪:
我正在使用以下代码配置 ASP.NET Core 3.1 控制器方法来上传包含 2 个部分的多部分请求,一个名为 "metadata" 以包含一个 JSON 模型,另一个名为 "file" 的部分包含实际的二进制文件。 Swagger UI 似乎可以正确呈现,但是在调用该操作时,它永远不会为我的元数据部分发送 "content-type"。
调试我的控制器方法时,文件二进制部分很好,包括 "content-type" header 但是当我检查元数据部分的 header 时,"content-type" header 丢失。我收到的元数据部分的唯一 header 是 "content-disposition".
我确认 swagger.json 正确显示 "application/json" 作为元数据部分的 content-type。
目前我正在使用 Swashbuckle.AspNetCore v5.0.0-rc4
我是否遗漏了操作筛选器中的任何内容或其他任何内容?
public class FileUploadOperationFilter : IOperationFilter
{
public virtual void Apply(OpenApiOperation operation, OperationFilterContext context)
{
context?.MethodInfo?.GetCustomAttribute<FileUploadOperationAttribute>()?.Apply(operation, context);
}
}
[AttributeUsage(AttributeTargets.Method)]
public class FileUploadOperationAttribute : Attribute
{
public Type MetadataType { get; }
public string MetadataPropertyName { get; set; } = "metadata";
public string FilePropertyName { get; set; } = "file";
public FileUploadOperationAttribute(Type metadataType)
{
MetadataType = metadataType;
}
public virtual void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation == null || context == null)
return;
var metadataSchema = context.SchemaGenerator.GenerateSchema(
MetadataType,
context.SchemaRepository);
operation.RequestBody = new OpenApiRequestBody
{
Content = new Dictionary<string, OpenApiMediaType>
{
["multipart/form-data"] = new OpenApiMediaType
{
Schema = new OpenApiSchema
{
Type = "object",
Properties = new Dictionary<string, OpenApiSchema>
{
[MetadataPropertyName] = metadataSchema,
[FilePropertyName] = new OpenApiSchema
{
Type = "string",
Format = "binary",
},
},
},
Encoding = new Dictionary<string, OpenApiEncoding>
{
[MetadataPropertyName] = new OpenApiEncoding
{
ContentType = "application/json",
},
},
}
},
};
}
}
[HttpPut("{fileName}/versions/{version}/content")]
[FileUploadOperation(typeof(SubmitFileRequest))]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(typeof(GenericActionResponse), StatusCodes.Status404NotFound)]
public async Task<IActionResult> SubmitFileVersionContentAsync([FromRoute] string fileName, [FromRoute] string version, CancellationToken cancellationToken)
{
// code omitted for brevity...
}
public class SubmitFileRequest
{
[Required]
public DateTime CreationTimeUtc { get; set; }
[Required]
public DateTime LastWriteTimeUtc { get; set; }
[Required]
public string InstallMethod { get; set; }
}
这是 Swagger UI 的一个问题 – 目前(截至 2019 年 12 月)它没有将 Content-Type
header 添加到 multipart/*
中的 JSON 数据] 要求。问题在此处跟踪: