Я использую System.Net.Http.HttpClient
чтобы выполнить некоторую клиентскую HTTP-связь. У меня есть все HTTP в одном месте, отвлеченные от остальной части кода. В одном случае я хочу прочитать контент ответа как поток, но потребитель потока хорошо изолирован от того, где происходит HTTP-связь, и поток открывается. В месте, ответственном за HTTP-связь, я избавляюсь от всего материала HttpClient
.
Этот unit тест завершится неудачно в 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
.
Таким образом, кажется, что код вызова должен знать и владеть ответным сообщением, а также потоком, или я оставляю сообщение ответа нераскрытым и позволяю финализатору справиться с ним. Ни один из вариантов не кажется правильным.
В этом ответе говорится о том, чтобы не HttpClient
. Как насчет сообщения HttpRequestMessage
и/или HttpResponseMessage
?
Я что-то упускаю? Я надеюсь, что потребительский код не знает HTTP, но оставление всех этих нераскрытых объектов идет против года привычки!