C# HttpWebRequest GET HTTP HTTPS 請求
阿新 • • 發佈:2019-01-11
這個需求來自於我最近練手的一個專案,在專案中我需要將一些自己發表的和收藏整理的網文集中到一個地方存放,如果全部採用手工操作工作量大而且繁瑣,因此周公決定利用C#來實現。在很多地方都需要驗證使用者身份才可以進行下一步操作,這就免不了POST請求來登入,在實際過程中發現有些網站登入是HTTPS形式的,在解決過程中遇到了一些小問題,現在跟大家分享。
通用輔助類
下面是我編寫的一個輔助類,在這個類中採用了HttpWebRequest中傳送GET/HTTP/HTTPS請求,因為有的時候需要獲取認證資訊(如Cookie),所以返回的是HttpWebResponse物件,有了返回的HttpWebResponse例項,可以獲取登入過程中返回的會話資訊,也可以獲取響應流。
程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.DirectoryServices.Protocols;
using System.ServiceModel.Security;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;
namespace BaiduCang
{
/// <summary>
/// 有關HTTP請求的輔助類
/// </summary>
public class HttpWebResponseUtility
{
private static readonly string DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
/// <summary>
/// 建立GET方式的HTTP請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器資訊,可以為空</param>
/// <param name="cookies">隨同HTTP請求傳送的Cookie資訊,如果不需要身份驗證可以為空</param>
/// <returns></returns>
public static HttpWebResponse CreateGetHttpResponse(string url,int? timeout, string userAgent,CookieCollection cookies)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "GET";
request.UserAgent = DefaultUserAgent;
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
return request.GetResponse() as HttpWebResponse;
}
/// <summary>
/// 建立POST方式的HTTP請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="parameters">隨同請求POST的引數名稱及引數值字典</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器資訊,可以為空</param>
/// <param name="requestEncoding">傳送HTTP請求時所用的編碼</param>
/// <param name="cookies">隨同HTTP請求傳送的Cookie資訊,如果不需要身份驗證可以為空</param>
/// <returns></returns>
public static HttpWebResponse CreatePostHttpResponse(string url,IDictionary<string,string> parameters,int? timeout, string userAgent,Encoding requestEncoding,CookieCollection cookies)
{
if (string.IsNullOrEmpty(url))
{
throw new ArgumentNullException("url");
}
if(requestEncoding==null)
{
throw new ArgumentNullException("requestEncoding");
}
HttpWebRequest request=null;
//如果是傳送HTTPS請求
if(url.StartsWith("https",StringComparison.OrdinalIgnoreCase))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion=HttpVersion.Version10;
}
else
{
request = WebRequest.Create(url) as HttpWebRequest;
}
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
if (!string.IsNullOrEmpty(userAgent))
{
request.UserAgent = userAgent;
}
else
{
request.UserAgent = DefaultUserAgent;
}
if (timeout.HasValue)
{
request.Timeout = timeout.Value;
}
if (cookies != null)
{
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cookies);
}
//如果需要POST資料
if(!(parameters==null||parameters.Count==0))
{
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
byte[] data = requestEncoding.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
return request.GetResponse() as HttpWebResponse;
}
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{