Swashbuckle IOperationFilter для загрузки файлов не работает, когда конечная точка имеет пользовательский параметр объекта - PullRequest
0 голосов
/ 20 января 2020

У меня есть конечная точка (пожалуйста, исправьте меня, если я использую неправильный термин), который принимает 3 параметра:

    [System.Web.Http.HttpPost]
    public HttpResponseMessage DeleteDocument(DocumentData data, string apiKey, string subjectType ="")
    {
        HttpResponseMessage result = null;
        var httpRequest = HttpContext.Current.Request;

        if (httpRequest.Files.Count < 1)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        } 
        var certFile = httpRequest.Files["cerFile"];
        byte[] certBytes;
        using (var stream = new MemoryStream())
        {
            certFile.InputStream.CopyTo(stream);
            certBytes = stream.ToArray();
        }
         ... 
   }

Здесь после запроса я получаю две строки и один объектный параметр. Все работает отлично, так далеко. Но мне также нужно передать 4-й параметр - файл. Затем я прочитал:

     ...
    var httpRequest = HttpContext.Current.Request; 
       if (httpRequest.Files.Count < 1)
    ....

Так что теперь в моем swagger-интерфейсе я должен добавить еще одно поле fileupload. Для этого я добавил FileUploadHelper

public class FileUploadHelper : IOperationFilter
{

    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.operationId.Contains("ServiceAPI"))
        {
            operation.consumes.Add("application/form-data");

            Parameter fileParam = new Parameter
            {
                name = "cerFile",
                @in = "formData",
                required = true,
                type = "file",
                description = "Файл сертифікату"
            }; 

            if (operation.parameters == null)
            {
                operation.parameters = new List<Parameter>() { fileParam }; 
                return;
            } 
            operation.parameters.Add(fileParam); 

        }
    }
}

и добавил в SwaggerConfig.cs

c.OperationFilter<FileUploadHelper>(); 

Теперь, когда я публикую данные со всеми 4 параметрами, я могу получить только строковые параметры. Файл и Объект не связаны. Однако я могу опубликовать файл, если удаляю данные объекта DocumentData, или я могу опубликовать параметр объекта, если удаляю FileUploadHelper, но мне нужны оба варианта, что я делаю неправильно? Пожалуйста помоги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...