Swashbuckle-Swagger执行按钮不起作用

问题描述

我正在尝试将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

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