首页 > 解决方案 > 添加自定义格式化程序时丢失了我的 JSON 媒体类型格式化程序

问题描述

Accept如果标头有,我正在尝试从我的 WebAPI 应用程序实现 CSV 响应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 格式化程序?

我究竟做错了什么?

标签: c#asp.net-coremime-types

解决方案


推荐阅读