System.Net.WebClient与代理身份验证407错误

时间:2009-07-29 20:06:05

标签: .net proxy webclient

我正在试图弄清楚如何健壮地处理代理身份验证错误(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正在使用系统设置,那似乎是多余的。

感谢任何帮助。

3 个答案:

答案 0 :(得分:11)

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

因此,即使.NET继承自IE设置,除非您恰好在IE中运行,否则您将无法获得对Basic / Digest的代理身份验证的任何“免费”支持;您需要提示用户或提供配置屏幕。

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:6)

我知道这是一篇旧文章,但我在使用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)