直接Copy拿去用吧:
新的 tls 協議需要新的.net版本, tls 至少更新到.net4吧,盡量用最新的.net! 不然出錯了就折騰...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel.Security;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;
namespace Lzp.Service
{
/// <summary>
/// 有關HTTP/HTTPS請求的輔助類 lzpong
/// 默認 UTF-8 編碼
/// </summary>
public class HTTPS
{
public HTTPS()
{
//spt = SecurityProtocolType.Tls;
requestEncoding = Encoding.GetEncoding("UTF-8");
requestUserAgent = DefaultUserAgent;
}
/// <summary>
/// SecurityProtocolType
/// 如果https出現"基礎連接..."或"ssl/tls..."錯誤,更改此屬性; 也可能需要升級 .net 已支持更新的安全協議
/// 不指定,使之自動協商/適應, 避免指定的版本與服務器不一樣反而連不上
/// </summary>
//public static SecurityProtocolType spt { get; set; }
//設置編碼 默認編碼是UTF-8
public static Encoding requestEncoding { get; set; }
//設置編碼
public static void SetEncoding(string endcode) { requestEncoding = Encoding.GetEncoding(endcode); }
private static string requestUserAgent = DefaultUserAgent;
private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36";
//設置瀏覽器版本
public static void SetUserAgent(string userAgent = null) { if (!String.IsNullOrWhiteSpace(userAgent))requestUserAgent = userAgent; else requestUserAgent = DefaultUserAgent; }
/// <summary>
/// 創建GET方式的HTTP/HTTPS請求
/// </summary>
/// <param name="url">請求的URL</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 CreateGet(string url, int? timeout = null, string userAgent = null, CookieCollection cookies = null)
{
return Create(url, null, "GET", requestEncoding, timeout, cookies);
}
/// <summary>
/// 創建POST方式的HTTP/HTTPS請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="datas">隨同請求POST的數據</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param>
/// <param name="requestEncoding">發送HTTP請求時所用的編碼</param>
/// <param name="headers">隨同HTTP請求發送的headers信息,如Cookie等</param>
/// <returns></returns>
public static HttpWebResponse CreatePost(string url, string datas= null, int? timeout = null, string headers = null)
{
return Create(url, datas, "POST", requestEncoding, timeout, headers);
}
/// <summary>
/// 創建HTTP/HTTPS請求
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="datas">隨同請求POST的參數名稱及參數值字典</param>
/// <param name="timeout">請求的超時時間</param>
/// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param>
/// <param name="requestEncoding">發送HTTP請求時所用的編碼</param>
/// <param name="headers">隨同HTTP請求發送的headers信息,如Cookie等</param>
/// <param name="AllowAutoRedirect">請求應自動跟隨 Internet 資源的重定向響應,則為 true,否則為 false。默認值為 true。</param>
/// <returns></returns>
public static HttpWebResponse Create(string url, string datas=null, string method = "GET", Encoding requestEncoding = null, int? timeout = null, string headers= null, bool AllowAutoRedirect=true)
{
if (string.IsNullOrEmpty(url))
throw new ArgumentNullException("url");
if (requestEncoding == null)
requestEncoding=Encoding.GetEncoding("UTF-8");
HttpWebRequest request = null;
//如果是發送HTTPS請求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
{
//ServicePointManager.SecurityProtocol = spt; //不指定,使之自動協商/適應, 避免指定的版本與服務器不一樣反而連不上
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
request = WebRequest.Create(url) as HttpWebRequest;
request.ProtocolVersion = HttpVersion.Version10;
}
else
request = WebRequest.Create(url) as HttpWebRequest;
request.Method = method;
request.UserAgent = requestUserAgent;
request.AllowAutoRedirect = AllowAutoRedirect;
if (timeout.HasValue)
request.Timeout = timeout.Value;
if (!string.IsNullOrWhiteSpace(headers))
{
string[] arr1 = headers.Split(new string[]{ "\r\n" },StringSplitOptions.RemoveEmptyEntries);
foreach(string s in arr1)
{
string[] arr2=s.Split(new string[]{ ": " }, StringSplitOptions.RemoveEmptyEntries);
if (arr2[0] == "Referer")
request.Referer = arr2[1];
else if (arr2[0] == "User-Agent")
request.UserAgent = arr2[1];
else if (arr2[0] == "Accept")
request.Accept = arr2[1];
else if (arr2[0] == "Range")
{
string[] arr3 = arr2[1].Split('-');
long f = long.Parse(arr3[0]);
long t = 0;
if(arr3.Length>1)
t=long.Parse(arr3[1]);
if (t < f)
request.AddRange(f, t);
else
request.AddRange(f);
}
else
request.Headers.Add(arr2[0], arr2[1]);
}
}
//如果需要POST數據
if (method == "POST")
{
request.ContentType = "application/x-www-form-urlencoded";
if (!String.IsNullOrWhiteSpace(datas))
{
byte[] data = requestEncoding.GetBytes(datas);
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)
{
return true; //總是接受
}
/// <summary>
/// GET 方法請求 獲取文本內容
/// </summary>
/// <param name="url">請求的URL</param>
/// <param name="headers">隨同HTTP請求發送的headers信息,如Cookie等</param>
///
public static string Get(string url,string heads=null,string encoding=null)
{
HttpWebResponse rq = HTTP.Create("GET", url, null, null, null, heads);
Stream rs = rq.GetResponseStream();
int bt;
MemoryStream mm = new MemoryStream(128);
while ((bt = rs.ReadByte()) > -1)
{
mm.WriteByte((byte)bt);
}
string data = Encoding.UTF8.GetString(mm.GetBuffer());//默認 utf8 編碼
if (rq.ContentType.IndexOf("html") > -1) //網頁內容
{
int n = data.IndexOf("content-type");
if (n > 0)
{//
n = data.IndexOf("charset", n);
if (n > 0) //去網頁內部指明的編碼
{
int m = data.IndexOf("\"", n + 1);
n = data.IndexOf("=", n) + 1;
string c = data.Substring(n, m - n).Trim();
data = Encoding.GetEncoding(c).GetString(mm.GetBuffer());
}
}
}
else if (!string.IsNullOrWhiteSpace(rq.CharacterSet) && rq.ContentType.IndexOf(';') > 0) //非網頁
{
data = Encoding.GetEncoding(rq.CharacterSet).GetString(mm.GetBuffer());
}
return data.Replace("\0", "");//要去掉末尾的'\0'
}
}
}
當然,有從網上搜羅的, 但是也是自己改裝優化過的,so 還是我的咯
轉載應注明http://home.cnblogs.com/u/lzpong/
