具有授权的WebClient下载文件不起作用
本文关键字:下载 文件 不起作用 WebClient 授权 | 更新日期: 2023-09-27 17:58:10
我已经尝试了我能想到的一切,包括我在网上找到的一些东西。我所要做的就是从我必须登录的网站下载一个文件(有直接链接)。
我试着用";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);
无论我尝试什么,我唯一能下载的就是一个最终成为登录页面的文件,就好像它不接受我传递的登录信息一样。
我看过头球之类的东西,没有发现任何异常可以解释为什么这不起作用。有什么想法吗?
我可以发誓我以前试过,但我想我可能只是有点不同。所以它是这样工作的:
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使它发挥了作用。我以为我以前也做过,但也许我做了一些不同的饼干。
这似乎是一个身份验证/授权问题。
造成这种情况的原因可能有很多,比如:1) 可以是身份验证/授权机制使用某种散列。2) 可能是您使用了错误的身份验证机制(正如我所看到的"基本")。3) 可能是您正在获得身份验证,但未获得授权。
找到根本原因的最佳方法是:使用Fiddler。使用UI页面登录并尝试下载文件。在这样做的时候,捕捉小提琴手的会话。无论你有什么代码,都可以尝试做同样的事情。再次捕捉小提琴演奏会。比较小提琴手找出区别。
希望这能有所帮助。
尝试临时更改证书验证:
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;
然而,这意味着web客户端将接受任何证书,因此请参阅本文了解更多信息。