我正在试图弄清楚如何健壮地处理代理身份验证错误(HTTP 407状态码)使用System.Net.WebClient类时。

在该字段中,我们看到许多用户接收407代理身份验证 WebException,但我不确定一个好的默认策略是什么。在.Net 2.0 / 3.5,代理身份验证设置应该继承自 Internet Explorer系统设置。 Firefox,Opera和Chrome使用这些 相同的设置。

以下是我们使用的基本代码:

using System.Net;

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

当此代码失败时,我们打开用户的浏览器并将其发送给帮助 页。从我们的网络日志中,我们知道这些客户可以成功连接 他们的浏览器也许他们手动输入他们的代理用户名和 密码才能到达我们的帮助页面?我们不知道。

似乎我们可以使用WebClient.UseDefaultCredentials,但是这个 如果WebClient正在使用系统设置,那似乎是多余的。

感谢任何帮助。

有帮助吗?

解决方案

如果代理身份验证使用BASIC或DIGEST,则Internet Explorer不会持久缓存/重用代理身份验证凭据。对于Negotiate / NTLM,将提供默认凭据。

因此,即使.NET继承自IE设置,你也不会得到任何“免费”的东西。支持Basic / Digest的代理身份验证,除非您碰巧在IE中运行;您需要提示用户或提供配置屏幕。

Fiddler(www.fiddler2.com)拥有“请求代理身份验证”功能。 “规则”菜单上的选项,可用于模拟此方案以进行测试。

其他提示

我们通过添加配置对话框解决了这个问题,该对话框允许用户选择“使用代理”。 如果完成此设置,我们使用这些参数(地址,凭证......)。 如果不是 - 我们假设可以在没有任何手动交互的情况下建立连接。 如果出现错误,我们会: a。)再次尝试使用默认凭据 b。)弹出配置中的设置可以帮助的信息...

如果代理身份验证是通过“默认凭据”完成的,则(Windows用户)IE也会对auth错误作出反应,并在这种情况下发送默认凭据。 如果这不起作用,则会打开凭据对话框。 我不确定所有浏览器是否都是这样处理的 - 但你只需尝试使用fiddler,就可以看到发生了什么。

我知道这是一篇旧文章,但我在使用WebClient在SSIS 2008R2(SQL Server Integration Services)脚本任务(VB.NET代码)中通过代理服务器下载到远程站点时遇到了类似的问题通过SSL保护,也需要身份验证。

花了一段时间才找到解决方案,这篇文章在代理方面提供了帮助。下面是适合我的脚本代码。可能对搜索类似内容的人有用。

    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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top