调用 ReadAsStreamAsync 时何时或是否要 Dispose HttpResponseMessage?

2023-12-28

我正在使用System.Net.Http.HttpClient http://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.118).aspx进行一些客户端 HTTP 通信。我将所有 HTTP 集中在一处,从代码的其余部分中抽象出来。在一种情况下,我想将响应内容作为流读取,但流的使用者与 HTTP 通信发生的位置以及流打开的位置很好地隔离。在负责 HTTP 通信的地方,我处理了所有HttpClient stuff.

该单元测试将失败于Assert.IsTrue(stream.CanRead):

[TestMethod]
public async Task DebugStreamedContent()
{
    Stream stream = null; // in real life the consumer of the stream is far away 
    var client = new HttpClient();        
    client.BaseAddress = new Uri("https://www.google.com/", UriKind.Absolute);

    using (var request = new HttpRequestMessage(HttpMethod.Get, "/"))
    using (var response = await client.SendAsync(request))
    {
        response.EnsureSuccessStatusCode();
        //here I would return the stream to the caller
        stream = await response.Content.ReadAsStreamAsync();
    }

    Assert.IsTrue(stream.CanRead); // FAIL if response is disposed so is the stream
}

我通常会尝试处理任何东西IDisposable尽早方便,但在这种情况下,处置HttpResponseMessage还处置Stream从返回ReadAsStreamAsync.

因此,调用代码似乎需要了解并获取响应消息以及流的所有权,或者我将响应消息保留为未处理状态,并让终结器处理它。这两种选择都感觉不对。

这个答案 https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed谈论不处置HttpClient。怎么样HttpRequestMessage and/or HttpResponseMessage?

我错过了什么吗?我希望让使用代码不了解 HTTP,但是留下所有这些未处理的对象违背了多年来的习惯!


所以看来调用代码需要了解并采取 响应消息和流的所有权,否则我离开 响应消息未处理并让终结器处理它。 这两种选择都感觉不对。

在这个具体案例中,没有终结器。两者都不HttpResponseMessage or HttpRequestMessage实现一个终结器(这是一件好事!)。如果您不处理它们中的任何一个,一旦 GC 启动,它们就会被垃圾收集,并且一旦发生这种情况,它们的底层流的句柄将被收集。

只要您还在使用这些物品,就不要丢弃。一旦完成,处理掉它们。而不是将它们包裹在using语句,您始终可以显式调用Dispose一旦你完成了。无论哪种方式,使用代码都不需要了解任何 http 请求的相关知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用 ReadAsStreamAsync 时何时或是否要 Dispose HttpResponseMessage? 的相关文章