¿Cuándo o si desechar HttpResponseMessage al llamar a ReadAsStreamAsync?

Estoy usando elSystem.Net.Http.HttpClient hacer alguna comunicación HTTP del lado del cliente. Tengo todo el HTTP en un solo lugar, abstraído del resto del código. En un caso, quiero leer el contenido de la respuesta como una secuencia, pero el consumidor de la secuencia está bien aislado de donde ocurre la comunicación HTTP y se abre la secuencia. En el lugar responsable de la comunicación HTTP, estoy eliminando todos losHttpClient cosas.

Esta prueba unitaria fallará enAssert.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
}

Normalmente trato de deshacerme de cualquier cosaIDisposable lo antes posible, pero en este caso, desecharHttpResponseMessage también dispone elStream regresó deReadAsStreamAsync.

Por lo tanto, parece que el código de llamada debe conocer y tomar posesión del mensaje de respuesta, así como de la transmisión, o dejo el mensaje de respuesta sin discutir y dejo que el finalizador se encargue de ello. Ninguna de las opciones se siente bien.

Esta respuesta habla de no deshacerse delHttpClient. Qué hay de laHttpRequestMessage y / oHttpResponseMessage?

¿Me estoy perdiendo de algo? ¡Espero mantener el código de consumo ignorante de HTTP, pero dejar todos estos objetos no expuestos alrededor va en contra del año de costumbre!

Respuestas a la pregunta(3)

Su respuesta a la pregunta