首页 > 解决方案 > 将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。对此有什么想法吗?

标签: c#stream

解决方案


最后,我将整个类设为一次性,并在此过程中将处理类之外的东西的责任转移到调用方法中。这消除了必须知道何时处理流的必要性


推荐阅读