使用HttpClient时遇Cannot access a closed Stream异常的原因及方案验证
HttpClient返回Stream后无法访问的问题解答
你的理解和临时解决方案完全正确,下面详细说明:
问题原因
using语句会在代码块结束时自动释放HttpResponseMessage对象,而该对象被释放时会连带关闭所有关联资源——包括你通过ReadAsStreamAsync()获取的pdfStream。所以当调用方尝试使用你返回的这个Stream时,它已经被关闭,自然会抛出Cannot access a closed Stream异常。
解决方案的合理性
将Stream完整复制到MemoryStream再返回的思路是完全可行的:
MemoryStream是基于内存的独立流,它不依赖HttpResponseMessage的生命周期,不会随HttpResponseMessage被释放而关闭。- 复制后重置
Position到0是必须的,确保调用方能从流的起始位置读取内容。
可以优化一下你的代码(去掉不必要的FlushAsync,并给原Stream加上using确保资源释放):
using (HttpResponseMessage httpResponseMsg = await httpClient.SendAsync(request, cxlToken)) { if (httpResponseMsg.IsSuccessStatusCode) { restDs.ResponseType = RestDataType.Stream; using (Stream pdfStream = await httpResponseMsg.Content.ReadAsStreamAsync()) { MemoryStream strm = new MemoryStream(); await pdfStream.CopyToAsync(strm); strm.Position = 0; restDs.ResponseContent = strm; } return restDs; } else { throw new Exception("Invalid return status."); } }
注意:返回的MemoryStream不要用using包裹,否则调用方拿到时它已经被关闭了。
内容的提问来源于stack exchange,提问作者sinDizzy
相关产品推荐
相关产品推荐

