设置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
相关产品推荐
相关产品推荐

