问题描述
我正在尝试将Swashbuckle.AspNetCore(5.5.1)与OAS3集成到Asp.Net core 3.1 Web API中。 我有一个post方法,其中我需要多部分表单数据(两个文件和一个字符串值),为此我在OperationFilter下应用了该方法,因为我不想在操作级别指定任何参数。
public class ComparePostParamTypes : IOperationFilter
{
public void Apply(OpenApiOperation operation,OperationFilterContext context)
{
var listofOutputFormats = new List<string> { "Rtf","Doc","DocX","Pdf" };
var optionArray = new OpenApiArray();
optionArray.AddRange(listofOutputFormats.Select(s => new OpenApiString(s)));
string documentOutputFormatText =
"The format to return";
switch (operation.OperationId)
{
case "File_Post":
operation.Parameters.Clear();
operation.Parameters = new List<OpenApiParameter>
{
new OpenApiParameter
{
Name = "file1",In = ParameterLocation.Query,required = true,Description = "First Document",Schema = new OpenApiSchema()
{
Type="string",Format="binary"
}
},new OpenApiParameter
{
Name = "file2",Description = "Second Document",new OpenApiParameter
{Name = "outputFormat",Description = documentOutputFormatText,Enum = optionArray,Default = new OpenApiString("Rtf"),}
}
};
break;
}
}
}
这是我的控制器端点
/// <summary>
/// POSTing two documents as a multipart/form-data.
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns>The result in the specified format (see outputFormat parameter)</returns>
/// <remarks>
/// Pass two document and output format</remarks>
/// <response code="200">OK</response>
/// <response code="500">Internal error</response>
/// <response code="403">Forbidden</response>
/// <response code="422">UnprocessableEntity</response>
/// <response code="503">ServiceUnavailable</response>
/// <response code="400">BadRequest</response>
[Produces("application/pdf","application/msword","application/zip")]
[Consumes("multipart/form-data")]
[ProducesResponseType(StatusCodes.Status200OK,Type = null)]
[ProducesResponseType(StatusCodes.Status500InternalServerError,Type = null)]
[ProducesResponseType(StatusCodes.Status403Forbidden,Type = null)]
[ProducesResponseType(StatusCodes.Status422UnprocessableEntity,Type = null)]
[ProducesResponseType(StatusCodes.Status503ServiceUnavailable,Type = null)]
[ProducesResponseType(StatusCodes.Status400BadRequest,Type = null)]
[HttpPost(Name ="File_Post")]
public IActionResult Post()
{
var builBoundary = Request.GetMultipartBoundary();
return Ok(builBoundary);
}
呈现正确的Swagger UI
但是在附加文件后单击执行按钮时,没有任何反应。
这是不可靠的JSON
{
"openapi": "3.0.1","info": {
"title": "Demo","version": "v1"
},"paths": {
"/File": {
"post": {
"tags": [
"File"
],"summary": "POSTing two documents as a multipart/form-data.","description": "Pass two document and output format","operationId": "File_Post","parameters": [
{
"name": "file1","in": "query","description": "First Document","required": true,"schema": {
"type": "string","format": "binary"
}
},{
"name": "file2","description": "Second Document",{
"name": "outputFormat","description": "The format to return","schema": {
"enum": [
"Rtf","Pdf"
],"type": "string","default": "Rtf"
}
}
],"responses": {
"200": {
"description": "OK"
},"500": {
"description": "Internal error"
},"403": {
"description": "Forbidden"
},"422": {
"description": "UnprocessableEntity"
},"503": {
"description": "ServiceUnavailable"
},"400": {
"description": "BadRequest"
}
}
}
}
},"components": { }
}
请告诉我该怎么做。
解决方法
我可以通过更新OperationFilter来解决此问题
public class ComparePostParamTypes : IOperationFilter
{
public void Apply(OpenApiOperation operation,OperationFilterContext context)
{
var listOfOutputFormats = new List<string> { "Rtf","Doc","DocX","Pdf" };
var optionArray = new OpenApiArray();
optionArray.AddRange(listOfOutputFormats.Select(s => new OpenApiString(s)));
string documentOutputFormatText =
"The format to return";
switch (operation.OperationId)
{
case "File_Post":
var multipartBodyPost = new OpenApiMediaType
{
Schema = new OpenApiSchema
{
Type = "object",Properties =
{
["file1"] = new OpenApiSchema
{
Description = "First Document",Type = "string",Format = "binary"
},["file2"] = new OpenApiSchema
{
Description = "Second Document",["outputFormat"] = new OpenApiSchema
{
Description = documentOutputFormatText,Enum = optionArray,Default = new OpenApiString("Rtf"),},Required = { "file1","file2" }
}
};
operation.RequestBody = new OpenApiRequestBody
{
Content =
{
["multipart/form-data"] = multipartBodyPost
}
};
break;
}
}
}
更多详细信息,请查看此链接https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1782