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

设置Response.Body为何会导致响应内容为空?

问题:取消注释Response.Body = file后内容长度变为0的原因

端点代码

var range = Request.GetTypedHeaders().Range;
var file = new MemoryStream(Enumerable.Range(0, 255).Select(x => (byte)x).ToArray());
// Response.Body = file;
return File(file, "application/octet-stream", "1.txt", null, new EntityTagHeaderValue($"\"1.txt\""), true);

请求发送代码

var request = new HttpRequestMessage { RequestUri = new Uri("http://localhost:5100/file") };
request.Headers.Range = new RangeHeaderValue(0, 100);
var response = new HttpClient().SendAsync(request).Result;
Debug.WriteLine($"ContentLength: {response.Content.Headers.ContentLength}");
Debug.WriteLine(response.RequestMessage);

正常输出(未取消注释时)

ContentLength: 100
Method: GET, RequestUri: 'https://localhost:7165/file', Version: 1.1, Content: <null>, 
Headers:
{
  Range: bytes=0-100
}

异常情况

取消注释Response.Body = file后,响应的ContentLength变为0,请问这是为什么?


原因解释

你手动给Response.Body赋值的操作,直接干扰了File方法的正常工作流程。

ASP.NET Core里的File方法本质是返回一个FileResult,它会自动完成这些核心工作:

  • 解析请求中的Range头,截取对应范围的流片段
  • 设置正确的ContentLength响应头
  • 将处理后的流写入响应

但如果你提前手动设置了Response.Body = file,FileResult在执行时会检测到Response已经被手动修改,就会跳过所有原本的处理逻辑——既不会处理Range请求去截取流,也不会帮你设置ContentLength。而你手动赋值的流没有被框架做任何后续处理,最终导致响应的ContentLength变成0。

如果一定要手动操作响应流,就得自己处理Range请求、计算内容长度并设置响应头,不能再依赖File方法;反之,完全交给File方法处理即可,无需手动赋值Response.Body。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:09:52