domingo, 28 de agosto de 2011

WebClient com Timeout

Algum tempo atrás iniciei um projeto que precisava fazer requisições HTTP para páginas Web e tratar seu resultado. Dentre as alternativas para isso resolvi escolher o WebClient por ser bem simples e resolver o problema que eu tinha em mãos de forma bem prática.

WebClient client = new WebClient(); string reply = client.DownloadString("[Url]"); Console.WriteLine(reply);

Este classe conta também com vários métodos para tratamento de forma assíncrona bem como suporte a comandos menos comuns como STOR (utilizado em FTP).

Mas nem tudo deu tão certo. Durante o desenvolvimento acabei verificando que o site em questão podia demorar bastante tempo para responder e que esse era um comportamento padrão do mesmo. Ou seja, eu teria que tratar isto de alguma forma, esperando mais tempo pelo resultado da requisição HTTP.

Nesse momento praticamente me vi forçado a utilizar classes mais complexas como as derivadas de WebRequest e WebResponse por causa da falta de suporte a definição do tempo de Timeout na classe WebClient.

Resolvi dar mais uma espiada na 50355_154915967879761_4814825_ndocumentação do MSDN e vi que poderia resolver isso de forma bem fácil graças a orientação a objetos.

Bastou herdar a classe WebClient e fazer um override do método protected GetWebRequest. Ali mesmo pude definir o meu timeout. Basicamente assim:

protected override WebRequest GetWebRequest(Uri address) { var request = base.GetWebRequest(address); request.Timeout = 60;//Timeout que quiser. return request; }

Claro que esta é apenas uma amostra do que pode ser feito, mas num caso real é apropriado colocar este valor em uma propriedade ou até mesmo definir no construtor da sua classe. Minha implementação completa pode ser encontrada neste link: WebClientExtended.

Enjoy