具有授权的 WebClient DownloadFile 不起作用

WebClient DownloadFile with Authorization not working

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

我尝试使用“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);

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

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);

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

我查看了 headers 等,但我没有看到任何异常情况可以解释为什么它不起作用。有什么想法吗?

这似乎是一个 authentication/authorization 问题。

造成这种情况的原因可能有很多,例如: 1) 可能是 authentication/authorization 机制使用某种哈希。 2) 可能是您使用了错误的身份验证机制("Basic" 如我所见)。 3) 可能是您正在通过身份验证但未获得授权。

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

希望对您有所帮助。

尝试暂时更改证书验证:

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 客户端将接受任何证书,因此请参阅 this post 了解更多信息。

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

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);

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