Pergunta

Eu estou tentando descobrir como lidar com robustamente erros de autenticação de proxy (HTTP 407 código de status) ao usar a classe System.Net.WebClient.

No campo, vemos muitos usuários receber uma autenticação de proxy 407 WebException, mas eu não tenho certeza do que uma boa estratégia padrão é. Na rede 2.0 / 3.5, as configurações de autenticação de proxy é suposto ser herdado as configurações de sistema do Internet Explorer. Firefox, Opera e Chrome usá-los mesmas configurações.

Aqui está o código básico que está a utilizar:

using System.Net;

string url = "http://www.mysite.com";
WebClient webClient = new WebClient();
byte[] data = webClient.DownloadFile(url);

Quando este código falhar, vamos abrir o browser do usuário e enviá-los para uma ajuda página. A partir dos nossos web logs, sabemos que esses clientes podem se conectar com êxito em seus navegadores. Talvez eles estão inserindo manualmente o seu nome de usuário proxy e password antes de chegar à nossa página de ajuda? Não sabemos.

Parece que nós poderíamos usar WebClient.UseDefaultCredentials, mas esta Parece redundante se WebClient está usando as configurações do sistema de qualquer maneira.

Qualquer ajuda é apreciada.

Foi útil?

Solução

Internet Explorer não persistentemente cache / reutilização credenciais de autenticação de proxy se o auth proxy usa BASIC ou DIGEST. Para Negociar / NTLM, será fornecido credenciais padrão.

Assim, embora .NET herda de configurações do IE, você não vai obter qualquer apoio "livre" para autenticação de proxy para o Basic / Digest, a menos que você acontecer para estar em execução no IE; você vai precisar para solicitar ao usuário ou fornecer uma tela de configuração.

Fiddler (www.fiddler2.com) tem a opção "Pedido de Autenticação Proxy" no menu Regras que você pode usar para simular este cenário para testar.

Outras dicas

Nós resolvemos esse problema adicionando uma janela de configuração que alows ao usuário escolher "Usar proxy". Se essa configuração é feita usamos estes parâmetros (endereço, credenciais ...). Se não - vamos supor que uma conexão pode ser feita sem qualquer interação manual. No caso de um erro que fazemos: a.) Tente novamente usando credenciais padrão b.) aparecer uma informação que um ajuste na configuração poderia ajudar ...

Se a autenticação proxy é feito através de "credenciais padrão" (usuários do Windows) IE também reage a um erro de autenticação e envia credenciais padrão neste caso. Se isso não funcionar, ele abre uma caixa de diálogo credenciais. Eu não tenho certeza se todos os navegadores lidar com isso dessa forma - mas você pode simplesmente dar-lhe uma tentativa usando violinista, assim você pode ver o que está acontecendo

.

Eu sei que este é um post antigo, mas eu tive um problema semelhante tentando baixar um arquivo XML usando WebClient em uma tarefa de script do SSIS 2008R2 (Integration Services SQL Server) (código VB.NET) através de um servidor proxy para um site remoto assegurado por meio de SSL que também requerida a autenticação.

Levou um tempo para encontrar uma solução e este post ajudou no lado proxy. Abaixo está o código de script que funcionou para mim. Pode ser útil a alguém que pesquisa similar.

    Dim objWebClient As WebClient = New WebClient()
    Dim objCache As New CredentialCache()

    'https://www.company.net/xxxx/resources/flt
    Dim strDownloadURL As String = Dts.Variables("FileURL").Value.ToString

    'apiaccount@company.net
    Dim strLogin As String = Dts.Variables("FileLogin").Value.ToString

    'sitepassword
    Dim strPass As String = Dts.Variables("FilePass").Value.ToString

    'itwsproxy.mycompany.com
    Dim strProxyURL As String = Dts.Variables("WebProxyURL").Value.ToString

    '8080
    Dim intProxyPort As Integer = Dts.Variables("WebProxyPort").Value

    'Set Proxy & Credentials as a Network Domain User acc to get through the Proxy
    Dim wp As WebProxy = New WebProxy(strProxyURL, intProxyPort)
    wp.Credentials = New NetworkCredential("userlogin", "password", "domain")
    objWebClient.Proxy = wp

    'Set the Credentials for the Remote Server not the Network Proxy
    objCache.Add(New Uri(strDownloadURL), "Basic", New NetworkCredential(strLogin, strPass))
    objWebClient.Credentials = objCache

    'Download file, use Flat File Connectionstring to save the file
    objWebClient.DownloadFile(strDownloadURL, Dts.Connections("XMLFile").ConnectionString)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top