你的位置:首页 > ASP.net教程

[ASP.net教程]【原创


一、说明

  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

三、代码解析

 

 

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