C#https登录和下载文件

我已成功连接到登录页面,但是,我不确定如何登录并获取登录后面的文件。 下面是我用来连接的代码。

private static bool bypassAllCertificateStuff(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error) { return true; } public static void Processing() { string url = "https://app/templat"; HttpWebRequest request; HttpWebResponse response; CookieContainer cookies; ServicePointManager.ServerCertificateValidationCallback = System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(bypassAllCertificateStuff); try { request = (HttpWebRequest)WebRequest.Create(url); request.AllowAutoRedirect = false; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.CookieContainer = new CookieContainer(); response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { cookies = request.CookieContainer; request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; String postData = "j_login=user&j_password=user&submit=Send"; byte[] data = System.Text.ASCIIEncoding.ASCII.GetBytes(postData); request.ContentLength = data.Length; //Stream stream = request.GetRequestStream(); //stream.Write(data, 0, data.Length); request.CookieContainer = cookies; //stream.Close(); StreamReader sr = new StreamReader(response.GetResponseStream()); string tmp = sr.ReadToEnd().Trim(); //response = (HttpWebResponse)request.GetResponse(); //WebClient wbClient = new WebClient(); //wbClient.DownloadFile("https://app/template/simple%2Screen.vm", @"C:\test.xls"); response.Close(); } else { Console.WriteLine("Client was unable to connect!"); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } 

我很肯定下载不起作用,我确定String postData不执行它的意图。

以下是网站登录的代码

 
 

我想下载的文件是通过这个链接https://app/template/simple%2Screen.vm

我能够建立与网页的连接,但我不确定如何登录和下载文件。

请参阅代码更新。 这仍然没有登录,我不知道为什么。

  string url = "https://mgr/app"; HttpWebRequest request; HttpWebResponse response; CookieContainer cookies = new CookieContainer(); ServicePointManager.ServerCertificateValidationCallback = System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(bypassAllCertificateStuff); try { string cookieHeader; string formParams = string.Format("j_login={0}&j_password={1}", "user", "user"); request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes(formParams); request.ContentLength = bytes.Length; using (Stream os = request.GetRequestStream()) { os.Write(bytes, 0, bytes.Length); } WebResponse resp = request.GetResponse(); cookieHeader = resp.Headers["Set-cookie"]; string pageSource; string BehinPath = "https://mgr/app/action/store.VivolAction/eventsubmit_dopreparevivollist/ignored"; WebRequest getRequest = WebRequest.Create(BehinPath); getRequest.Headers.Add("Cookie", cookieHeader); WebResponse getResponse = getRequest.GetResponse(); using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) { pageSource = sr.ReadToEnd(); } 

这是新代码,有1个cookie,但是当我尝试第一个post时它从不登录。

您的代码有以下问题我可以看到:

  1. 没有正确处理cookie容器。 应该初始化CookieContainer,然后将其传递给您的HttpWebRequest,而不是相反。
  2. 不清理一次性物品。 在垃圾收集器赶上它之前,未能处置对象会导致对象停留很长一段时间。
  3. 不考虑表单操作。 您的表单操作将导致提交到其他位置。
  4. 作为POST,不必要地执行第一个操作。 请改用GET。
  5. 执行POST操作时不设置引用程序。

请尝试以下代码:

  Uri url = new Uri("http://app/templat"); HttpWebRequest request = null; // Uncomment the line below only if you need to accept an invalid certificate, ie a self-signed cert for testing. // ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); CookieContainer cookieJar = new CookieContainer(); request = (HttpWebRequest)WebRequest.Create(url); request.CookieContainer = cookieJar; request.Method = "GET"; HttpStatusCode responseStatus; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { responseStatus = response.StatusCode; url = request.Address; } if (responseStatus == HttpStatusCode.OK) { UriBuilder urlBuilder = new UriBuilder(url); urlBuilder.Path = urlBuilder.Path.Remove(urlBuilder.Path.LastIndexOf('/')) + "/j_security_check"; request = (HttpWebRequest)WebRequest.Create(urlBuilder.ToString()); request.Referer = url.ToString(); request.CookieContainer = cookieJar; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; using (Stream requestStream = request.GetRequestStream()) using (StreamWriter requestWriter = new StreamWriter(requestStream, Encoding.ASCII)) { string postData = "j_username=user&j_password=user&submit=Send"; requestWriter.Write(postData); } string responseContent = null; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream responseStream = response.GetResponseStream()) using (StreamReader responseReader = new StreamReader(responseStream)) { responseContent = responseReader.ReadToEnd(); } Console.WriteLine(responseContent); } else { Console.WriteLine("Client was unable to connect!"); } 

首先,您需要在第一次请求之前启动cookie容器:

 CookieContainer cookies = new CookieContainer(); 

然后你需要在每个请求上传递它(现在你只是再次实例化它,因此失去了所有的cookie):

 request.CookieContainer = cookies; 

您获得的响应将使用必要的cookie填充cookie容器。

此外,正如我所见,您需要在网站上执行一系列请求/响应并跟踪cookie。 使用像Fiddler这样的工具来查看您需要如何制定POST字符串以正确登录网站。

Name:
Password: