【C#】 封装的异步HttpRequest
2021/8/28 20:36:17
本文主要是介绍【C#】 封装的异步HttpRequest,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
#define TEST //#undef TEST using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; using System.Web; namespace SocketUtil { public static class HttpHelper { //http://localhost:3322/ // http://localhost:63483/ #if TEST public static string ApiUrl= "http://localhost:63483/actionapi/"; #else public static string ApiUrl = "http://localhost:3322/actionapi/"; #endif /// <summary> /// http/https请求响应 /// </summary> /// <param name="getOrPost"></param> /// <param name="url">地址(要带上http或https)</param> /// <param name="headers">请求头</param> /// <param name="parameters">提交数据</param> /// <param name="dataEncoding">编码类型 utf-8</param> /// <param name="contentType">application/x-www-form-urlencoded</param> /// <returns></returns> ///这个是异步的,如果请求的api处理很慢, ///就不会阻塞ui线程 public static Task<WebResponse> HttpRequestAsync( string getOrPost, string url, Dictionary<string, string> headers, Dictionary<string, string> parameters, Encoding dataEncoding, string contentType ) { var request = CreateRequest(getOrPost, url, headers, parameters, dataEncoding, contentType); //如果需要POST数据 if (getOrPost == "POST" && !(parameters == null || parameters.Count == 0)) { var data = FormatPostParameters(parameters, dataEncoding, contentType); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); stream.Close(); } } var task= request.GetResponseAsync(); return task; //if (null == Res) //{ // return request.GetResponse() as HttpWebResponse; //} //return (HttpWebResponse)Res; } /// <summary> /// 创建HTTP请求对象 /// </summary> /// <param name="getOrPost"></param> /// <param name="url"></param> /// <param name="headers"></param> /// <param name="parameters"></param> /// <param name="paraEncoding"></param> /// <param name="contentType"></param> /// <returns></returns> private static HttpWebRequest CreateRequest( string getOrPost , string url , Dictionary<string, string> headers , Dictionary<string, string> parameters , Encoding paraEncoding , string contentType ) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (parameters != null && parameters.Count > 0 && paraEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; if (getOrPost == "GET") { if (parameters != null && parameters.Count > 0) { url = FormatGetParametersToUrl(url, parameters, paraEncoding); } } //判断是否是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; } if (getOrPost == "GET") { request.Method = "GET"; } else { request.Method = "POST"; } if (contentType == null) { request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; } else { request.ContentType = contentType; } //POST的数据大于1024字节的时候,如果不设置会分两步 request.ServicePoint.Expect100Continue = false; request.ServicePoint.ConnectionLimit = int.MaxValue; if (headers != null) { FormatRequestHeaders(headers, request); } return request; } /// <summary> /// 格式化请求头信息 /// </summary> /// <param name="headers"></param> /// <param name="request"></param> private static void FormatRequestHeaders(Dictionary<string, string> headers, HttpWebRequest request) { foreach (var hd in headers) { //因为HttpWebRequest中很多标准标头都被封装成只能通过属性设置,添加的话会抛出异常 switch (hd.Key.ToLower()) { case "connection": request.KeepAlive = false; break; case "content-type": request.ContentType = hd.Value; break; case "transfer-enconding": request.TransferEncoding = hd.Value; break; default: request.Headers.Add(hd.Key, hd.Value); break; } } } /// <summary> /// 格式化Get请求参数 /// </summary> /// <param name="url">URL</param> /// <param name="parameters">参数</param> /// <param name="paraEncoding">编码格式</param> /// <returns></returns> private static string FormatGetParametersToUrl(string url, Dictionary<string, string> parameters, Encoding paraEncoding) { if (url.IndexOf("?") < 0) url += "?"; int i = 0; string sendContext = ""; foreach (var parameter in parameters) { if (i > 0) { sendContext += "&"; } sendContext += HttpUtility.UrlEncode(parameter.Key, paraEncoding) + "=" + HttpUtility.UrlEncode(parameter.Value, paraEncoding); ++i; } url += sendContext; return url; } /// <summary> /// 格式化Post请求参数 /// </summary> /// <param name="parameters">编码格式</param> /// <param name="dataEncoding">编码格式</param> /// <param name="contentType">类型</param> /// <returns></returns> private static byte[] FormatPostParameters(Dictionary<string, string> parameters, Encoding dataEncoding, string contentType) { string sendContext = ""; int i = 0; if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { sendContext = "{"; } foreach (var para in parameters) { if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { if (i > 0) { if (para.Value.StartsWith("{")) { sendContext += string.Format(@",""{0}"":{1}", para.Key, para.Value); } else { sendContext += string.Format(@",""{0}"":""{1}""", para.Key, para.Value); } } else { if (para.Value.StartsWith("{")) { sendContext += string.Format(@"""{0}"":{1}", para.Key, para.Value); } else { sendContext += string.Format(@"""{0}"":""{1}""", para.Key, para.Value); } } } else { if (i > 0) { sendContext += string.Format("&{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding)); } else { sendContext = string.Format("{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding)); } } i++; } if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { sendContext += "}"; } byte[] data = dataEncoding.GetBytes(sendContext); return data; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } } }
调用
private async void btn_testToken_Click(object sender, EventArgs e) { Dictionary<string, string> dicP = new Dictionary<string, string>(); dicP.Add("UserName", _uInfo.UserName); Dictionary<string, string> dicHead = new Dictionary<string, string>(); dicHead.Add("Authorization", "BasicAuth " +_uInfo.Token); var reqTask = HttpHelper.HttpRequestAsync("GET", HttpHelper.ApiUrl + "User/GetGameInfo", dicHead, dicP, Encoding.UTF8, "application/json; charset=UTF-8"); await reqTask;//这样不会阻塞ui线程 WebResponse Res = null; try { Res = reqTask.Result; } catch (WebException ex) { Res = (HttpWebResponse)ex.Response; } catch (Exception e1) { MessageBox.Show(e1.Message); } //return (HttpWebResponse)Res; System.IO.StreamReader readerPOST; readerPOST = new System.IO.StreamReader(Res.GetResponseStream(), Encoding.UTF8); var retJson = readerPOST.ReadToEnd(); //得到响应结果 readerPOST.Close(); Res.Close(); txt_json.Text = retJson; }
//是参考的:https://blog.csdn.net/sinat_16998945/article/details/84071384
不过他这个有bug,当为GET请求时,url参数不能被拼接。他下面评论区指出了的。
这篇关于【C#】 封装的异步HttpRequest的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID