将http响应流复制到内存流,而无需将所有数据复制到内存

时间:2018-11-02 12:47:43

标签: c# stream

我有流,它来自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类实现同等可实现,我可以将负责将东西放置在StreamGetter类之外的责任。调用类现在可以创建一个using块,调用“ GetSomeStream”方法,并在using块内全部处理结果。然后,StreamGetter的dispose方法将处理HttpClient。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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