При добавлении пользовательского форматера потерял форматеры JSON - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь реализовать CSV-ответ от моего приложения WebAPI, если заголовок Accept имеет text/csv, но я хочу, чтобы тип содержимого по умолчанию был application/json (т. Е. Если заголовок Accept отсутствуетпри условии, что будет выводиться JSON).

Я сделал простой сериализатор CSV:

public class CsvMediaTypeFormatter : OutputFormatter
{
    public CsvMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/csv"));
    }

    public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
    {
        var content = context.Object;
        var response = context.HttpContext.Response;
        var outputStreamWriter = new StreamWriter(response.Body);
        var csvWriter = new CsvHelper.CsvWriter(outputStreamWriter);
        if(content is IEnumerable)
        {
            csvWriter.WriteRecords(content as IEnumerable);
        }
        else
        {
            csvWriter.WriteRecord(content);
        }
        return Task.CompletedTask;
    }
}

... затем я подключил его так в своем файле Startup.cs:

services.AddOData();
services.AddMvcCore(options =>
{
    options.RespectBrowserAcceptHeader = true;
    options.OutputFormatters.Add(new CsvMediaTypeFormatter());
    options.FormatterMappings.SetMediaTypeMappingForFormat("csv", MediaTypeHeaderValue.Parse("text/csv"));
    var csvFormatter = options.OutputFormatters.OfType<CsvMediaTypeFormatter>().First();
    csvFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/csv"));
    foreach (var outputFormatter in options.OutputFormatters.OfType<ODataOutputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
    {
        outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
    }
    foreach (var inputFormatter in options.InputFormatters.OfType<ODataInputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
    {
        inputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
    }
}).AddJsonOptions(options =>
{
    options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter { CamelCaseText = false });
    options.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddApiExplorer();

Типы носителей OData уже существуют и, похоже, никогда не вызывали проблем.

Если посмотреть на примеры, которые я нашел в Интернете, это должно сработать, но теперь я получаю ошибку 415 при попытке войти в систему.страница, которая обычно application/json с сообщением о неподдерживаемом типе носителя.Я как-то уничтожил форматер JSON по умолчанию?

Что я делаю не так?

...