首页 > 解决方案 > Swashbuckle - Swagger 执行按钮不起作用

问题描述

我正在尝试使用 Swashbuckle.AspNetCore (5.5.1) 和 OAS3 将 swagger 集成到 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", In = ParameterLocation.Query,
                            Required = true,
                            Description = "Second Document",
                            Schema = new OpenApiSchema()
                            {
                                Type="string",
                                Format="binary"
                            }
                        },
                        new OpenApiParameter
                        {Name = "outputFormat", In = ParameterLocation.Query, Description = documentOutputFormatText,
                            Schema = new OpenApiSchema()
                            {
                                Type="string",
                                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",
            "in": "query",
            "description": "Second Document",
            "required": true,
            "schema": {
              "type": "string",
              "format": "binary"
            }
          },
          {
            "name": "outputFormat",
            "in": "query",
            "description": "The format to return",
            "schema": {
              "enum": [
                "Rtf",
                "Doc",
                "DocX",
                "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": { }
}

请告诉我我应该怎么做才能解决这个问题。

标签: asp.net-core-3.1swashbuckle.aspnetcore

解决方案


我可以通过更新 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",
                                Type = "string",
                                Format = "binary"
                            },
                            ["outputFormat"] = new OpenApiSchema
                            {
                                Description = documentOutputFormatText,
                                Type = "string",
                                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


推荐阅读