.NET IWebProxy: evite converter os proxies do sistema em WebProxy
Trate um proxy do sistema devolvido como IWebProxy sem presumir que a sua classe concreta é WebProxy.
IWebProxy policy = WebRequest.GetSystemWebProxy();
request.Proxy = policy;
Mantenha o objeto devolvido como IWebProxy. Este fragmento aplica-se a código existente baseado em WebRequest, não é uma recomendação de adotar essa API legada numa aplicação nova.
WebProxy implementa a interface, mas nem todos os objetos que implementam a interface herdam de WebProxy. Um wrapper do sistema pode, por isso, rejeitar a conversão antes de qualquer pedido de rede ocorrer. Um nome de classe privada do .NET Framework como WebProxyWrapperOpaque é um detalhe de implementação, não um problema do endpoint do proxy nem da conta.
Para decidir uma rota, chame IsBypassed(destination) e GetProxy(destination) com o URI real de destino. Um desvio pode devolver esse mesmo destino, e uma política baseada em PAC pode escolher outra rota para outro host.
Para autenticação, IWebProxy já expõe Credentials. Use a conta e o método suportados sem converter para chegar à propriedade.
Extrair um único URI para construir um WebProxy substituto descarta o comportamento por destino da política original. Faça isso apenas quando um endpoint fixo for a configuração pretendida da aplicação, não como solução alternativa para um erro de tipo.