Quando fazemos a requisição através da classe HttpClient, informamos o endereço do recurso que queremos acessar, e através de algum método, como por exemplo, o GetAsync, é possível receber o resultado esperado. Apesar de na maioria das vezes já sabermos o que o teremos como resultado, em alguns momentos podemos querer fazer alguma verificação antes de materializar o conteúdo que foi retornado.
A questão é que para materializar o tal conteúdo, precisamos alocar memória e realizar algum processamento, e que pode ser desnecessário dependendo da uma eventual condição que temos que avaliar antes de efetivamente carregar o conteúdo. Para os métodos expostos pela classe HttpClient, há uma versão que nos permite passar uma das opções do enumerador HttpCompletionOption, a saber.
-
ResponseHeadersRead: indica que a operação deve ser considerada como completa depois que os headers forem lidos. A conteúdo ainda não.
-
ResponseContentRead: indica que a operação somente será considerada como completa depois que todo o corpo da mesma já tenha sido lido e materializado.
Como vamos buscar o conteúdo através do método GetAsync, iremos definir a opção ResponseHeadersRead para analisarmos os headers antes de carregar o conteúdo. Quando a requisição voltar, faremos a verificação para analisar se o conteúdo (através do header Content-Type) é ou não do tipo HTML, e se for, o acessamos da forma que desejarmos. Essa técnica evitará o carregamento desnecessário do corpo da mensagem, ou seja, postergaremos a carga até que se realmente precise dela, poupando recursos da máquina de onde o consuma está sendo realizado.
using (var client = new HttpClient())
{
var resposta =
await client.GetAsync(“http://www.microsoft.com”, HttpCompletionOption.ResponseHeadersRead);
if (resposta.Content.Headers.ContentType.MediaType != “text/html”)
{
var conteudo = await resposta.Content.ReadAsStringAsync();
//utilizar o conteúdo
}
}