Добавление Content-Type в запрос на получение Swashbuckle - PullRequest
2 голосов
/ 11 февраля 2020

Я использую Swashbuckle 5.0 и. Net Core 3.1

Существует метод Get, который может возвращать результаты в различных форматах (JSON и XML).

Я читал, что новейшие версии Swagger должны иметь возможность анализировать этот код

    [HttpGet]
    [Produces("application/json", "application/xml")]
    public async Task<IActionResult> Get()
    {
        var model = new MyModel();
        return Ok(model);
    }

и создавать правильные конфигурации Swagger и, наконец, иметь в пользовательском интерфейсе что-то вроде enter image description here.

Но этот код почему-то не работает. Я что-то упускаю или это просто ошибка последней версии Swashbuckle, и мне нужно go с некоторыми обходными путями?

Обновление (спасибо Jawad): Моя начальная конфигурация Форматтеры выглядят так:

services.AddControllers(options => 
{
    options.RespectBrowserAcceptHeader = true;
})
.AddXmlSerializerFormatters()
.AddXmlDataContractSerializerFormatters()
.AddNewtonsoftJson(opt => { opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; });

Я не совсем уверен, почему существуют 2 XML форматеров (возможно, некоторые проблемы слияния), но до этого момента он работал как-то.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Похоже, что Swagger UI отображает типы мультимедиа только тогда, когда тип возвращаемого значения известен. Поскольку вы возвращаете ActionResult, Swashbuckle не имеет информации о типе возвращаемого значения. Когда я изменяю контроллер на

public async Task<T> Get()

или добавляю атрибут

[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(T))]

, я могу видеть различные типы содержимого ответа в моем приложении

1 голос
/ 11 февраля 2020

Убедитесь, что вы добавили SupportedMediaTypes в файл WebApiConfig.cs,

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
...