一个上好的C# http/https类
直接Copy拿去用吧:
新的 tls 协议需要新的.net版本, tls 至少更新到.net4吧,尽量用最新的.net! 不然出错了就折腾...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | 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 已支持更新的安全协议<br> /// 不指定,使之自动协商/适应, 避免指定的版本与服务器不一样反而连不上 /// </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;<br> 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/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
原文链接:https://www.cnblogs.com/lzpong/p/5545464.html
--- auth:lzpong
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!