Asp.Net Core 2.0 API返回text/html响应解决406错误方法
解决ASP.NET Core 2.0 API返回text/html响应的406错误问题
我来帮你搞定这个问题——你遇到的406 Not Acceptable错误,本质是因为ASP.NET Core默认的Ok()方法处理字符串时,会自动把它当作JSON来序列化,设置响应的Content-Type为application/json。如果客户端的请求头Accept没有包含这个类型,就会触发406错误。
最简单的解决方案:使用ContentResult替换Ok()
直接用Content()方法返回响应,它允许你明确指定Content-Type,完美适配你的需求:
修改你的方法最后一行:
// 替换原来的 return Ok(jsonstring); return Content(jsonstring, "text/html; charset=utf-8");
修改后的完整代码示例
[HttpGet("api/scoInfo/")] public async Task<IActionResult> GetScoInfo([FromQuery]int activityId, [FromQuery]int studentId, [FromQuery] long timeStamp) { if (!ModelState.IsValid) { return BadRequest(ModelState); } var learningTask = await _context.LearningTasks.SingleOrDefaultAsync(m => m.Id == activityId); if (learningTask == null) { return NotFound(); } var jsonstring = learningTask.Data; // 直接返回text/html类型的响应 return Content(jsonstring, "text/html; charset=utf-8"); }
为什么原来的.NET 4.6.1代码可行?
在旧的ASP.NET Web API中,StringContent会直接将你指定的Content-Type附加到响应上,框架不会额外干预。但ASP.NET Core的Ok()方法依赖于格式化器系统(默认是JSON格式化器),即使你传入的是字符串,它也会按JSON规则处理,导致Content-Type被设置为application/json,从而引发406错误。
额外说明:如果需要全局配置(不推荐单个API场景)
如果你的多个API都需要返回text/html,可以全局配置格式化器,但这种方式会影响所有响应,所以只适合统一需求的场景:
// 在Startup.cs的ConfigureServices方法中添加 services.AddMvc(options => { options.OutputFormatters.Add(new StringOutputFormatter()); }) .AddJsonOptions(options => { // 保留你的JSON配置 });
不过对于单个API来说,用Content()方法是最直接、最灵活的选择。
内容的提问来源于stack exchange,提问作者Roddy Balkan
相关产品推荐
相关产品推荐

