I would like to download a file using VB.NET (preferably) or C# via HTTPS.
I have this code to download a file over plain HTTP:
Dim client As WebClient = New WebClient()
Dim wp As WebProxy = New WebProxy("[IP number of our proxy server]", [port number of our proxy server])
wp.Credentials = CredentialCache.DefaultCredentials
client.Proxy = wp
client.DownloadFile("http://sstatic.net/so/img/logo.png", "c:\logo.png")
This works.
How do I chang开发者_如何学Goe this code to download a file that is stored on an HTTPS-server? I guess it has something to do with adding credentials or something.
You need to add a certificate validator:
// You need to call it only once in a static constructor or multiple times there is no problem
ServicePointManager.ServerCertificateValidationCallback = ValidateCertificate;
private static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
In VB:
ServicePointManager.ServerCertificateValidationCallback = AddressOf ValidateCertificate
Dim client As WebClient = New WebClient()
'...
'Your code
Private Shared Function ValidateCertificate(sender As Object, certificate As X509Certificate, chain As X509Chain, sslPolicyErrors As SslPolicyErrors) As Boolean
return True
End Function
You just need to point that address to your HTTPS resource and to inform your credential:
client.Credentials = new NetworkCredential("username", "password");
client.DownloadFile("https://your.resource.here", @"localfile.jog")
You're talking about how to log into a site protected by a HTML form login. I wrote this code sometime ago and you could to adapt it to login into your remote site: Orkut Login Code
Things you need to keep in mind:
- If that's an ASP.NET site, you need to call it first to get
__EVENTTARGET
and__EVENTARGUMENT
values, as they're required to process your login postback. If it's not, skip this step. - You need to identify that names that site uses to fill your username and password
- You must to add a
CookieContainer
. It keeps your login cookie, so subsequent calls uses that authenticated context. - After all that, you should be able to get your remote resource and to download it
Try something like this
WebClient wc = new WebClient();
wc.UseDefaultCredentials = false;
CredentialCache creds = new CredentialCache();
creds.Add(new Uri(url), "Basic",new NetworkCredential(username, password, domain));
wc.Credentials = creds;
wc.Headers.Add(HttpRequestHeader.UserAgent,"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;");
//wc.Headers["Accept"] = "/";
wc.DownloadFile(url,localpath);
精彩评论