You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置OkObjectResult返回application/pdf时Postman报406错误是什么原因?

问题根因

你使用的OkObjectResult依赖ASP.NET Core的内容协商机制处理响应:

  • 当你主动给ContentTypes添加application/pdf后,内容协商模块只会尝试匹配能输出application/pdf的响应格式化器
  • 框架默认没有内置可将byte[]序列化为application/pdf的格式化器,协商匹配失败就返回406 Not Acceptable
  • 你注释掉对应行之后,内容协商走默认逻辑,用JSON格式化器将byte[]序列化为Base64编码的JSON字符串返回,所以返回200但Content-Type是application/json

正确解决方案

要返回指定Content-Type的PDF二进制流,直接用专门处理文件响应的FileResult即可,不需要用OkObjectResult:

byte[] pdf_test = System.IO.File.ReadAllBytes(@"C:\somewhere\hello.pdf");
// 第二个参数指定Content-Type,第三个可选参数指定下载文件名,不需要可省略
return File(pdf_test, "application/pdf", "hello.pdf");

FileResult会跳过内容协商流程,直接将字节流写入响应体,同时正确设置响应头的Content-Type为application/pdf,完全符合业务要求。

如果必须使用ObjectResult实现,你需要提前在Program.cs中注册支持application/pdf的字节数组格式化器:

builder.Services.AddControllers(options =>
{
    var byteFormatter = new ByteArrayOutputFormatter();
    byteFormatter.SupportedMediaTypes.Add("application/pdf");
    options.OutputFormatters.Insert(0, byteFormatter);
});

配置完成后原有代码即可正常返回预期响应,但该方案不如直接使用FileResult简洁直观,更推荐前者。

内容的提问来源于stack exchange,提问作者Shintaro Takechi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:45:04