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