Swashbuckle.AspNetCore 5.0.0-rc4 UploadFileFilter не работает - PullRequest
0 голосов
/ 12 ноября 2019

Мне нужно добавить файл загрузки для Swashbuckle.AspNetCore 5.0.0-rc4. В более ранней версии это работает так:

public class SwaggerUploadFileParametersFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters != null)
        {
            var attribute =
                apiDescription.ActionDescriptor.GetCustomAttributes<UploadFileParametersAttribute>()
                    .FirstOrDefault();
            if (attribute != null)
            {
                operation.consumes.Add("multipart/form-data");
                operation.parameters.Add(new Parameter
                {
                    name = "file",
                    required = true,
                    type = "file",
                    @in = "formData"
                }
                );
            }
        }
    }
}

[UploadFileParameters]
public async Task<IHttpActionResult> MyMethod([FromUri]MyMethodParams parameters)

Я пытаюсь реализовать это, используя Microsoft.OpenApi.Models объекты:

   public class SwaggerUploadFileParametersFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            var actionAttributes = context.MethodInfo.GetCustomAttributes<UploadFileParametersAttribute>().FirstOrDefault();
            if (actionAttributes != null)
            {
                operation.RequestBody = new OpenApiRequestBody()
                {
                    Content =
                    {
                        ["multipart/form-data"] = new OpenApiMediaType()
                        {
                            Schema = new OpenApiSchema()
                            {
                                Properties =
                                {
                                    ["file"] = new OpenApiSchema()
                                    {
                                        Description = "Select file",
                                        Type = "file"
                                    }
                                }
                            }
                        }
                    }
                };
            }
        }
    }

Но это не работает. Я не вижу файловый компонент в чванстве

1 Ответ

1 голос
/ 29 ноября 2019

Я взял ваш код и некоторую документацию из Загрузка файла Swagger

Я изменил ваш код и добавил небольшое исправление

public class SwaggerUploadFileParametersFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var parameters = operation.Parameters;
        if (parameters == null || parameters.Count == 0)
        {
            return;
        }
        var isUploadFile = context.ApiDescription.ActionDescriptor.Parameters.Any(x => x.ParameterType == typeof(IFormFile));

        if (isUploadFile)
        {
            operation.RequestBody = new OpenApiRequestBody()
            {
                Content =
                {
                    ["multipart/form-data"] = new OpenApiMediaType()
                    {
                        Schema = new OpenApiSchema()
                        {
                            Type = "object",
                            Properties =
                            {
                                ["file"] = new OpenApiSchema()
                                {
                                    Description = "Select file", Type = "string", Format = "binary"
                                }
                            }
                        }
                    }
                }
            };
        }
    }
}

И контроллер:

[HttpPost]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesDefaultResponseType]
public async Task<IActionResult> UploadFileAsync([FromForm] IFormFile file)
...