c# - 将http响应流复制到内存流而不将所有数据复制到内存
问题描述
我有流,它来自 HttpContent 对象的 ReadAsStreamSync() 方法。我从一个方法返回这个流,所以我的方法的调用者可以直接从 http 流中读取,而不必在内存中缓冲整个响应。
我现在遇到的问题是,我需要知道我返回的流何时被处理。由于流上没有“disposed”事件,我想我可以将流包装在一个继承 memorystream 的类中,并覆盖 dispose 方法。但是,我不想将整个响应流复制到内存流,因为这意味着整个内容都将写入内存。我认为这是可能的,但我似乎找不到任何有关它的信息。
有没有人可以帮我解决这个问题?或者为我提供一种替代方法,以便能够判断何时处理流。
编辑:
看了评论,好像不是很清楚。让我给你一个具体的例子:
public class StreamGetter()
{
public Stream GetSomeStream()
{
//some code here that gets the stream
//and return the stream, this stream might be 100mb long,
//and since this method doesn't know what to do with it,
//we return the stream so the calling method can figure it out
return generatedStream;
}
}
public void SomeOtherMethod()
{
using(var stream = GetSomeStream())
{
//some some stuff
}
}
现在的问题是,获取的流是来自 httpResponseMessage 内容的 ReadAsStreamAsync() 的流,它是使用 HttpClient 获取的。现在我需要在处理流后处理 HttpClient 。如果我更早地处理它,我将无法再从流中读取。如果我不处理它,则永远不会释放资源。
现在,在任何人开始提及之前,我不应该处置 HttpClient,因为它是为重复使用而设计的。我知道,我不重用HttpClient,而是底层的HttpClientHandler。
如果您认为我的设计是一个糟糕的设计,我也愿意接受有关如何以不同方式编写代码的建议。唯一的要求是我将所有与 HttpClient 相关的代码保存在“StreamGetter”类中,并将结果流的所有处理都保存在“StreamGetter”类之外。
edit2:我想我通过更改课程找到了解决方案。通过使 StreamGetter 类实现 idisposable,我可以将责任转移到 StreamGetter 类之外。调用类现在可以创建一个 using 块,调用“GetSomeStream”方法,并在 using 块中处理所有结果。StreamGetter 的 dispose 方法然后释放 HttpClient。对此有什么想法吗?
解决方案
最后,我将整个类设为一次性,并在此过程中将处理类之外的东西的责任转移到调用方法中。这消除了必须知道何时处理流的必要性
推荐阅读
- javascript - Webpack:动态依赖加载
- c# - XML 使用 SelectNodes 来获取具有空值子节点的节点
- sql - SQL 根据不同列中的值选择行
- sql - 根据其他列的最大值选择值
- python - 在同一进程中使用 Gstreamer 和 multiprocessing.Manager().Namespace() 时发生内存泄漏
- artifactory - Artifactory OSS:元数据服务日志项目更新错误
- spring - JPA:如何读取实体的特定字段?
- react-hook-form - 反应钩子形式:as vs render:无法理解语法以及它们有何相同之处
- node.js - NodeJS 无法访问 postgres 数据库
- java - 如何在 EC2 和 SQS 以及本地机器到 SQS 之间进行身份验证