Wenn, oder wenn, zu Entsorgen HttpResponseMessage beim Aufruf ReadAsStreamAsync?

Ich bin mit dem System.Net.Http.HttpClient, um einige der client-Seite die HTTP-Kommunikation. Ich habe alle HTTP-an einem Ort, abstrahiert von dem rest des Codes. In einem Fall will ich die Antwort Lesen-Inhalte als stream an, aber der Verbraucher, der stream ist gut isoliert, von wo aus die HTTP-Kommunikation geschieht, und der stream wird geöffnet. In der Stelle, verantwortlich für die HTTP-Kommunikation ich bin die Entsorgung aller von der HttpClient Zeug.

Dieser unit-test schlägt fehl bei 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
}

Ich in der Regel versuchen, entsorgen Sie alles, was IDisposable zum frühest möglichen Komfort, aber in diesem Fall, entsorgen Sie die HttpResponseMessage verfügt auch über die Stream zurück von ReadAsStreamAsync.

So scheint es, wie der aufrufende code muss wissen über und den Besitz der response-Nachricht als auch als stream, oder lasse ich die response-Nachricht undisposed und lassen Sie den finalizer mit der Situation umgehen. Weder die option fühlt sich richtig an.

Diese Antwort spricht nicht über die Entsorgung der HttpClient. Wie über die HttpRequestMessage - und/oder HttpResponseMessage?

Bin ich etwas fehlt? Ich bin der Hoffnung, zu halten die Konsum-code unwissend über HTTP, sondern dass alle diese undisposed Objekte herum geht gegen Jahre der Gewohnheit!

  • Nur ein Tipp - Nicht alles IDisposable entsorgt werden muss
  • Dies scheint nicht, nichts zu tun haben mit async per se. Die Regeln sind die gleichen, so oder so: nicht entsorgen, das Objekt, bis Sie fertig ist. Das gleiche würde gelten, mit der synchronen version. Also, nutzen Sie die zurückgegebenen Stream innerhalb der using. Wenn Sie brauchen, um verwenden Sie die Stream außerhalb des Kontexts, in dem die Anforderung erstellt haben, müssen Sie zum einrichten eines anderen Mechanismus zu verfügen, die zur rechten Zeit.
  • Also: ich empfehle, nicht verlassen Entsorgung für den finalizer...aber ich beachten Sie, dass Sie nicht die Mühe zu entsorgen client sowieso, also, wenn Sie fühlen, nicht die Mühe mit dem anderen Zeug auch nicht. Wie für die Antwort, die Sie Referenz, beachten Sie, dass es sich auf das Szenario, wo Sie die Wiederverwendung der HttpClient Objekt; ehrlich gesagt, sollte es offensichtlich sein, dass, wenn Sie wiederverwenden möchten, müssen Sie nicht entsorgen Sie es. Die Anleitung sagt nicht, überhaupt etwas darüber, ob es legitim zu lassen das Objekt Entsorgung geschieht über die Fertigstellung (und IMHO ist es sehr schlechte form zu).
InformationsquelleAutor dkackman | 2014-12-31
Schreibe einen Kommentar