c# - 添加自定义格式化程序时丢失了我的 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 格式化程序?
我究竟做错了什么?
解决方案
推荐阅读
- javascript - 将 javascript 变量值传递给表单内的输入类型隐藏值
- c# - 尽管有 IAppBuilder.MapSignalR(),但未找到信号器/信号器/集线器
- c# - 如何使用 ASP.NET Core 3.1 替换 Swashbuckle 5.0.0 中的消费和生产?
- mysql - Laravel 应用程序上的删除数据应该有限制行为,但它没有
- docker - 如何查看 Docker Desktop 安装的版本?
- view - RapidClipse X - 弹出视图
- visual-studio - 由于无法检索令牌,尝试与 Azure DevOps 通信失败
- javascript - 在第二次调用 jquery 时出现 403 AJAX 错误
- java - Powermock 和 Jmockit 是否有替代方法来模拟静态和私有方法?
- python - Pandas - 基于列对行进行分组并用非空值替换 NaN