【问题标题】:WebClient DownloadFile with Authorization not working具有授权的 WebClient 下载文件不起作用
【发布时间】:2016-11-25 11:23:32
【问题描述】:

我已经尝试了几乎所有我能想到的方法来让它发挥作用,包括我在网上找到的一些东西。我要做的就是从我必须登录的网站下载一个文件(有一个直接链接)。

我尝试使用“UploadValues”执行以下操作:

WebClient myWebClient = new WebClient();
NameValueCollection myNameValueCollection = new NameValueCollection();
myNameValueCollection.Add("username", this.UserName);
myNameValueCollection.Add("password", this.Password);
byte[] responseArray = myWebClient.UploadValues(felony, myNameValueCollection);
myWebClient.DownloadFile(felony, localfelony);

我也尝试将登录信息放在标题中。正如您从注释代码中看到的那样,我也尝试设置凭据:

WebClient client = new WebClient();
//client.UseDefaultCredentials = false;
//client.Credentials = new NetworkCredential(this.UserName, this.Password);
client.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(this.UserName + ":" + this.Password)));
client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36");
//client.Headers.Add(HttpRequestHeader.Cookie, this.webBrowser.Document.Cookie);
client.DownloadFile(felony, localfelony);

无论我尝试什么,我唯一能下载的就是一个最终成为登录页面的文件,就好像它不接受我传递的登录信息一样。

我查看了标题等,我没有看到任何异常可以解释为什么这不起作用。有什么想法吗?

【问题讨论】:

    标签: c# download authorization webclient webclient-download


    【解决方案1】:

    我可以发誓我以前尝试过这个,但我想我可能只是有点不同或其他什么。所以它是这样工作的:

    WebClient client = new WebClient();
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential(this.UserName, this.Password);
    client.Headers.Add(HttpRequestHeader.Cookie, "_gat=1; b46467afcb0b4bf5a47b2c6b22e3d284=mt84peq7u4r0bst72ejs5lb7p6; https://docs.stlucieclerk.com/=1,1; _ga=GA1.2.12049534.1467911267");
    client.DownloadFile(webaddress, localname);
    

    是标题中的 cookie 使它起作用。我以为我以前做过,但也许我做了一些涉及不同 cookie 的事情。

    【讨论】:

      【解决方案2】:

      这似乎是身份验证/授权问题。

      造成这种情况的原因可能有很多: 1)可能是认证/授权机制使用了某种散列。 2)可能是您使用了错误的身份验证机制(我可以看到“基本”)。 3) 可能是您正在获得身份验证但未获得授权。

      找出根本原因的最佳方法是: 使用提琴手。 使用 UI 页面登录并尝试下载文件。在这样做的同时捕获提琴手会话。那里尝试对您拥有的任何代码执行相同的操作。再次捕获提琴手会话。比较 fiddler 找出不同之处。

      希望这会有所帮助。

      【讨论】:

      • 不幸的是,我必须提出安装 Fiddler 的正式请求,我做到了,但这需要几天时间。我一直在查看 Chrome 在其“网络”选项卡上显示的信息,但没有看到任何可以解释为什么我尝试的方法不起作用的信息。
      【解决方案3】:

      尝试临时更改证书验证:

      System.Net.Security.RemoteCertificateValidationCallback r = System.Net.ServicePointManager.ServerCertificateValidationCallback; System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object s, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; }; //Do downloading here... System.Net.ServicePointManager.ServerCertificateValidationCallback = r;

      然而,这意味着网络客户端将接受任何证书,因此请参阅this 帖子了解更多信息。

      【讨论】:

      • 这在任何一种情况下似乎都没有帮助。 :(
      • 对不起,我遇到了类似的问题,这解决了它:(
      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多