首页 > 代码库 > 【原创-算法-实现】异步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     }
Remoter.cs

  使用方式:

  GET: 

技术分享
1 var remoter = new Remoter();2 remoter.RequestMethod = "GET";3 remoter.URL = "这里是你要请求的URL";4 var response = remoter.GetRemoteData();
View Code

  POST:

技术分享
1 var remoter = new Remoter();2 remoter.RequestMethod = "POST";3 remoter.URL = "你要请求的URL";4 remoter.JsonContent = "你要想URL发送的JSON数据";5 var response = remoter.GetRemoteData();
View Code

三、代码解析

 

 

四、计划中的开源项目...

 

【原创-算法-实现】异步HTTP请求操作