首页 > 代码库 > 【原创-算法-实现】异步HTTP请求操作
【原创-算法-实现】异步HTTP请求操作
一、说明
1) 这个类 是我 在真实项目中,优化解决真实问题 时,不参考第三方代码,完全由自己查阅MSDN官方文档 , 完成的一个真实生产环境中使用的功能类
2) 读者在使用此类时,请尊重原创,在代码中加上原创注释:// Author -- Meng.NET (cnblogs.com) ,同时欢迎 二次改进、二次创作 以共同进步
3) 此代码以【面向对象】、【C#闭包】、【异步回调】、【超时】、【等待】、【自动重试】方式实现及完成,且可以配置扩展
二、代码
废话不多说,上干货,代码如下:
1 /// <summary> 2 /// 异步 Http 3 /// </summary> 4 public class Remoter 5 { 6 /* 7 * LM,2016/08/18 8 * C#闭包化,异步化,Web操作 9 * 以便支持POS多接口多操作同时使用 10 */ 11 12 /// <summary> 13 /// 请求地址 14 /// </summary> 15 public string URL { get; set; } 16 17 /// <summary> 18 /// 请求方式 19 /// </summary> 20 public string RequestMethod { get; set; } 21 22 /// <summary> 23 /// 请求数据 24 /// </summary> 25 public string JsonContent { get; set; } 26 27 // 28 private byte[] Buffer { get; set; } 29 private Stream RequestStream { get; set; } 30 private HttpWebRequest Request { get; set; } 31 private bool ResponseFlag { get; set; } 32 private string Result { get; set; } 33 private bool TimeoutFlag { get; set; } 34 private int TimeoutTime { get; set; } 35 private bool RetryFlag { get; set; } 36 private int RetryCount { get; set; } 37 private int WaitSleep { get; set; } 38 private int TrySleep { get; set; } 39 40 // 初始化 41 public Remoter() 42 { 43 // 44 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; 45 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) => true); 46 47 // 48 this.URL = string.Empty; 49 this.Request = default(HttpWebRequest); 50 this.JsonContent = string.Empty; 51 this.Buffer = default(byte[]); 52 this.RequestStream = default(Stream); 53 this.ResponseFlag = false; 54 this.Result = string.Empty; 55 this.TimeoutFlag = false; 56 this.TimeoutTime = 10 * 1000; 57 this.RetryFlag = false; 58 this.RetryCount = 3; 59 this.WaitSleep = 10; 60 this.RequestMethod = "POST"; 61 this.TrySleep = 2000; 62 } 63 64 /// <summary> 65 /// 获取响应数据 66 /// </summary> 67 public string GetRemoteData() 68 { 69 // 70 if(string.IsNullOrWhiteSpace(this.URL)) 71 { 72 throw new Exception("HttpAsync.URL,未赋值!"); 73 } 74 75 // 76 RemoteNew(SetResult); 77 78 // 79 var timeNum = 0; 80 while (true) 81 { 82 if (ResponseFlag) 83 { 84 break; 85 } 86 if (TimeoutFlag) 87 { 88 throw new Exception(string.Format("请求超时!超时时间:{0}S", TimeoutTime / 1000)); 89 } 90 timeNum += WaitSleep; 91 if (timeNum >= TimeoutTime) 92 { 93 TimeoutFlag = true; 94 } 95 Thread.Sleep(WaitSleep); 96 } 97 98 // 99 return Result;100 }101 102 // 103 private void RemoteNew(Action<Remoter, string> action) 104 {105 //106 var reNum = 0;107 for (var i = 0; i < this.RetryCount; i++)108 {109 try110 {111 //112 var uri = URL;113 114 //115 this.Request = WebRequest.Create(uri) as HttpWebRequest;116 this.Request.KeepAlive = false;117 this.Request.Method = this.RequestMethod;118 this.Request.Credentials = CredentialCache.DefaultCredentials;119 if (this.RequestMethod.Equals("POST", StringComparison.OrdinalIgnoreCase))120 {121 this.Buffer = Encoding.UTF8.GetBytes(this.JsonContent);122 this.Request.ContentLength = this.Buffer.Length;123 this.Request.ContentType = "application/json";124 this.RequestStream = this.Request.GetRequestStream();125 this.RequestStream.Write(this.Buffer, 0, this.Buffer.Length);126 this.RequestStream.Close();127 }128 129 //130 this.Request.BeginGetResponse((arr) =>131 {132 //133 var state = arr.AsyncState as Remoter;134 //135 var response = state.Request.EndGetResponse(arr) as HttpWebResponse;136 var respStream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8"));137 action(state, respStream.ReadToEnd());138 respStream.Close();139 response.Close();140 }, this);141 //142 break;143 }144 catch (Exception ex)145 {146 Thread.Sleep(this.TrySleep);147 reNum++;148 if (reNum == this.RetryCount)149 {150 throw new Exception(string.Format("重试失败!重试次数:{0}次,失败原因:{1}", this.RetryCount, ex.Message));151 }152 continue;153 }154 }155 } 156 private void SetResult(Remoter state, string jsonData)157 {158 if (!string.IsNullOrWhiteSpace(jsonData))159 {160 state.Result = jsonData;161 state.ResponseFlag = true;162 }163 }164 }
使用方式:
GET:
1 var remoter = new Remoter();2 remoter.RequestMethod = "GET";3 remoter.URL = "这里是你要请求的URL";4 var response = remoter.GetRemoteData();
POST:
1 var remoter = new Remoter();2 remoter.RequestMethod = "POST";3 remoter.URL = "你要请求的URL";4 remoter.JsonContent = "你要想URL发送的JSON数据";5 var response = remoter.GetRemoteData();
三、代码解析
四、计划中的开源项目...
【原创-算法-实现】异步HTTP请求操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。