ASP.NET 5接口返回纯文本额外附带起止和长度数字如何解决
你遇到的多余数字是ASP.NET 5(属于.NET Core体系)默认启用分块传输编码产生的标记。.NET Framework默认不会自动启用该机制,所以你的老项目没有这个问题。
当你没有手动指定Content-Length响应头时,ASP.NET Core会默认使用分块传输传输响应内容,格式为[块长度(十六进制)]\r\n[块内容]\r\n,最后用长度为0的块标记结束,你看到的数字就是分块的长度标识。
方案1:使用框架内置的ContentResult返回(最推荐)
不要手动操作Response流,直接在控制器方法中返回ContentResult,框架会自动处理响应头和内容格式,不会产生多余标记:
[HttpPost] public IActionResult YourApi() { // 跨域头建议统一在中间件/全局配置里加,不需要每个接口单独写 return Content("FAIL", "text/plain"); }
方案2:手动写Response时补充配置
如果你一定要直接操作Response对象,需要做两处调整:
- 把非标准的
application/text修改为标准纯文本MIME类型text/plain - 手动添加
Content-Length头,显式指定响应内容的字节长度,告诉框架不需要启用分块传输
response.Headers.Add("Access-Control-Allow-Methods", "POST"); response.Headers.Add("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, X-Requested-With, Session"); response.ContentType = "text/plain"; response.StatusCode = StatusCodes.Status200OK; // 提前计算内容字节长度,禁用分块传输 var contentBytes = System.Text.Encoding.UTF8.GetBytes("FAIL"); response.Headers.Add("Content-Length", contentBytes.Length.ToString()); await Response.Body.WriteAsync(contentBytes, 0, contentBytes.Length); await response.CompleteAsync();
额外排查项
如果调整后还是有多余内容,检查是否有自定义的响应中间件、过滤器在你写入内容后额外操作了响应流,比如日志埋点、响应包装类的逻辑重复写入了内容。
内容的提问来源于stack exchange,提问作者MDP77
相关产品推荐
相关产品推荐

