Я пытаюсь реализовать 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 по умолчанию?
Что я делаю не так?