C # SwaggerGen + AutoRest - как отправить тело потока?

Я предполагаю, что это довольно типичный сценарий: наше решение предоставляет API, созданный из контроллеров C# ядра asp, из которого мы генерируем swagger.json (используя https://github.com/domaindrivendev/Swashbuckle.AspNetCore).

Мы вызываем этот API в коде через клиент C#, созданный с помощью AutoRest (https://github.com/Azure/autorest).

Чтобы выполнить потенциально большую загрузку, мы хотели бы использовать наш сгенерированный AutoRest клиент для передачи потока от вызывающего объекта C# к нашему серверному, чтобы избежать сериализации/десериализации всего объекта.

Я не могу понять, как я мог бы использовать два инструмента вместе, чтобы передать поток с вызовом из нашего кода С#. Я пытался добавить его в качестве параметра, но это приводит к тому, что AutoRest создает модель «Stream» для System.IO.Stream, которая затем используется в качестве типа входного параметра, а не просто сохраняет исходный тип. Я пытался передать его как параметр [FromBody], но в дополнение к указанной выше проблеме AutoRest также вводит его как StringContent, прежде чем добавлять его в запрос вместо StreamContent (вероятно, потому что SwaggerGen не идентифицирует его как поток? ).

Буду признателен за любые советы. Но если мы не можем этого сделать, я думаю, мы всегда можем использовать HTTPClient вручную.


person Stephen O    schedule 16.02.2018    source источник


Ответы (1)


Мы не смогли решить эту проблему и в итоге получили далеко не идеальное решение, которое все еще было (для нас) предпочтительнее использования HTTPClient, сгенерированного вручную.

  • Наша модель Swagger не принимает поток (мы по-прежнему используем поток, мы просто получаем его непосредственно из запроса AspNetCore внутри нашего контроллера. У нас есть собственный валидатор, который гарантирует, что поток присутствует и имеет ненулевую длину)
  • Мы создали частичный класс, который будет работать вместе с нашим автоматически сгенерированным клиентом API.
  • Мы взяли метод, который должен был принимать поток, и скопировали его дословно из автоматически сгенерированного API-клиента, и поместили его в наш новый разделяемый класс.
  • Мы изменили метод автоматически сгенерированного кода, чтобы он принимал поток.
  • Мы изменили автоматически сгенерированный код, добавив следующее:

            // BEGIN MANUALLY MODIFIED CODE
        _httpRequest.Content = new StreamContent(inputStream);
        // ensure that Expect Continue behaviour is always used for binary submissions
        _httpRequest.Headers.ExpectContinue = true;
        // END MANUALLY MODIFIED CODE 
    

Теперь мы просто используем этот сгенерированный вручную метод для всех вызовов этой конечной точки вместо автоматически сгенерированного метода. Это связано с парой существенных оговорок:

  • Если модель Swagger изменится, нам нужно вручную обновить сгенерированный вручную метод.
  • Любой, кто издевается над системой, должен знать, что наш код использует метод, который принимает поток, а не автоматически сгенерированный метод.
person Stephen O    schedule 12.09.2018
comment
Это довольно старый вопрос, но вам когда-нибудь удавалось заставить его работать правильно, пожалуйста? - person rumblefx0; 12.01.2021
comment
@rumblefx0 - я больше не участвую в этом проекте, но я только что просмотрел общедоступный репозиторий для него, и хак все еще там. Есть примечание, чтобы пересмотреть хак для Swagger 3.0. - person Stephen O; 14.01.2021
comment
Спасибо за ответ, что-нибудь придумаем... :) - person rumblefx0; 15.01.2021