2009-07-29 61 views
12

我想弄清楚如何在使用System.Net.WebClient类时稳健地处理代理验证错误(HTTP 407状态码)。System.Net.WebClient与代理验证407错误

在该字段中,我们看到许多用户接收到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使用系统设置,这个 似乎是多余的。

任何帮助表示赞赏。

回答

11

Internet Explorer不会持续缓存/重用代理身份验证凭据如果代理身份验证使用基本或摘要。对于Negotiate/NTLM,将提供默认凭据。因此,即使.NET继承自IE设置,除非您恰好在IE中运行,否则您不会获得Basic/Digest代理身份验证的任何“免费”支持;您需要提示用户或提供配置屏幕。

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

+2

谢谢埃里克。小提琴奏效。 澄清,对于Negotiate/NTML,无论是否设置UseDefaultCredentials = true,WebClient都将提供默认凭据?换句话说,在处理407 WebException并使用UseDefaultCredentials = true重试时是否有价值?为什么不总是设置UseDefaultCredentials = true?安全风险? 意见声明:WinInet似乎处理得更好。鉴于宇宙中的每个人都想要遍历代理,为什么不自动执行此操作或者触发事件并提供用于输入/保存证书的标准UI? – Daniel 2009-07-31 20:32:46

+0

我使用Fiddler进行了更多实验。我认为只要提供像下面这样的用户名和密码(“1”,“1”)很容易,但它不起作用。 string url =“http://www.java.com/”; webClient = new WebClient(); CredentialCache cache = new CredentialCache(); cache.Add(new Uri(url),“Basic”,new NetworkCredential(“1”,“1”)); webClient.Proxy.Credentials = credentialCache; webClient.Credentials = credentialCache; string contents = webClient.DownloadString(url); – Daniel 2009-07-31 23:47:32

+1

得到它的工作。由于某种原因,CredentialCache不起作用。我必须将NetworkCredential传递给webClient.Proxy.Credentials。 – Daniel 2009-08-01 00:02:34

6

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

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

+0

感谢您的详细工作流程。 – 2010-10-07 22:07:14

6

我知道这是一个旧的帖子,但我有一个类似的问题,试图通过代理服务器将SSIS 2008R2(SQL Server Integration Services)脚本任务(VB.NET代码)中的WebClient使用WebClient下载到远程网站通过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 

    '[email protected] 
    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) 
相关问题