1     /// <summary>  
  2     /// 有关HTTP请求的辅助类  
  3     /// </summary>  
  4     public class HttpQuery
  5     {
  6         private static readonly string DefaultUserAgent =
  7             "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
  8 
  9         public static void Get(string url, object data, Action<string> callback)
 10         {
 11             IDictionary<string, string> parameters = Getparameters(data);
 12 
 13             if (!(parameters == null || parameters.Count == 0))
 14             {
 15                 url += "?";
 16                 foreach (var item in parameters)
 17                 {
 18                     url += item.Key + "=" + item.Value + "&";
 19                 }
 20             }
 21             CreateGetHttpResponse(url, null, null, null, callback);
 22         }
 23 
 24         public static void Post(string url, object data, Action<string> callback)
 25         {
 26             IDictionary<string, string> parameters = Getparameters(data);
 27 
 28             CreatePostHttpResponse(url, parameters, null, null, Encoding.UTF8, null, callback);
 29         }
 30 
 31         public static void Post(string url, string data, Action<string> callback)
 32         {
 33             CreatePostHttpResponse(url, data, null, null, Encoding.UTF8, null, callback);
 34         }
 35 
 36         private static IDictionary<string, string> Getparameters(object data)
 37         {
 38             if (data == null)
 39             {
 40                 return new Dictionary<string, string>();
 41             }
 42             IDictionary<string, string> parameters = new Dictionary<string, string>();
 43 
 44             Type type = data.GetType();
 45             PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
 46             foreach (PropertyInfo p in props)
 47             {
 48                 parameters.Add(p.Name, p.GetValue(data).ToString());
 49             }
 50 
 51             return parameters;
 52         }
 53 
 54         /// <summary>  
 55         /// 创建GET方式的HTTP请求  
 56         /// </summary>  
 57         /// <param name="url">请求的URL</param>  
 58         /// <param name="timeout">请求的超时时间</param>  
 59         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
 60         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
 61         /// <returns></returns>  
 62         private static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent,
 63             CookieCollection cookies, Action<string> callback, string encoding = "utf-8")
 64         {
 65             if (string.IsNullOrEmpty(url))
 66             {
 67                 return null;
 68                 //throw new ArgumentNullException("url");
 69             }
 70             try
 71             {
 72                 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
 73                 request.Method = "GET";
 74                 request.UserAgent = DefaultUserAgent;
 75                 if (!string.IsNullOrEmpty(userAgent))
 76                 {
 77                     request.UserAgent = userAgent;
 78                 }
 79                 if (timeout.HasValue)
 80                 {
 81                     request.Timeout = timeout.Value;
 82                 }
 83                 if (cookies != null)
 84                 {
 85                     request.CookieContainer = new CookieContainer();
 86                     request.CookieContainer.Add(cookies);
 87                 }
 88 
 89                 HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
 90 
 91                 StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
 92                     System.Text.Encoding.GetEncoding(encoding));
 93 
 94                 string html = "";
 95                 //获取请求到的数据
 96                 html = reader.ReadToEnd();
 97                 //关闭
 98                 httpWebResponse.Close();
 99                 reader.Close();
100 
101                 Regex regex = new Regex("charset=(?<code>\\w+)\"");
102                 Match match = regex.Match(html);
103                 string code = match.Groups["code"].Value;
104                 if (!string.IsNullOrWhiteSpace(code) && code.ToLower() != encoding.ToLower())
105                 {
106                     return CreateGetHttpResponse(url, timeout, userAgent, cookies, callback, code);
107                 }
108                 else
109                 {
110                     callback(html);
111                     return httpWebResponse;
112                 }
113             }
114             catch
115             {
116                 callback(null);
117             }
118             return null;
119         }
120 
121         /// <summary>  
122         /// 创建POST方式的HTTP请求  
123         /// </summary>  
124         /// <param name="url">请求的URL</param>  
125         /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>  
126         /// <param name="timeout">请求的超时时间</param>  
127         /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>  
128         /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>  
129         /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>  
130         /// <returns></returns>  
131         private static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters,
132             int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, Action<string> callback)
133         {
134             if (string.IsNullOrEmpty(url))
135             {
136                 throw new ArgumentNullException("url");
137             }
138             if (requestEncoding == null)
139             {
140                 throw new ArgumentNullException("requestEncoding");
141             }
142             HttpWebRequest request = null;
143             try
144             {
145                 //如果是发送HTTPS请求  
146                 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
147                 {
148                     ServicePointManager.ServerCertificateValidationCallback =
149                         new RemoteCertificateValidationCallback(CheckValidationResult);
150                     request = WebRequest.Create(url) as HttpWebRequest;
151                     request.ProtocolVersion = HttpVersion.Version10;
152                 }
153                 else
154                 {
155                     request = WebRequest.Create(url) as HttpWebRequest;
156                 }
157                 request.Method = "POST";
158                 request.ContentType = "application/x-www-form-urlencoded";
159 
160                 if (!string.IsNullOrEmpty(userAgent))
161                 {
162                     request.UserAgent = userAgent;
163                 }
164                 else
165                 {
166                     request.UserAgent = DefaultUserAgent;
167                 }
168 
169                 if (timeout.HasValue)
170                 {
171                     request.Timeout = timeout.Value;
172                 }
173                 if (cookies != null)
174                 {
175                     request.CookieContainer = new CookieContainer();
176                     request.CookieContainer.Add(cookies);
177                 }
178                 //如果需要POST数据  
179                 if (!(parameters == null || parameters.Count == 0))
180                 {
181                     StringBuilder buffer = new StringBuilder();
182                     int i = 0;
183                     foreach (string key in parameters.Keys)
184                     {
185                         if (i > 0)
186                         {
187                             buffer.AppendFormat("&{0}={1}", key, parameters[key]);
188                         }
189                         else
190                         {
191                             buffer.AppendFormat("{0}={1}", key, parameters[key]);
192                         }
193                         i++;
194                     }
195                     byte[] data = requestEncoding.GetBytes(buffer.ToString());
196                     using (Stream stream = request.GetRequestStream())
197                     {
198                         stream.Write(data, 0, data.Length);
199                     }
200                 }
201 
202                 HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
203 
204                 StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
205                     System.Text.Encoding.GetEncoding("utf-8"));
206 
207                 string html = "";
208                 //获取请求到的数据
209                 html = reader.ReadToEnd();
210 
211                 //关闭
212                 httpWebResponse.Close();
213                 reader.Close();
214 
215                 callback(html);
216 
217                 return httpWebResponse;
218             }
219             catch
220             {
221                 callback(null);
222             }
223             return null;
224         }
225 
226         private static HttpWebResponse CreatePostHttpResponse(string url, string parameters, int? timeout,
227             string userAgent, Encoding requestEncoding, CookieCollection cookies, Action<string> callback)
228         {
229             if (string.IsNullOrEmpty(url))
230             {
231                 return null;
232                 //throw new ArgumentNullException("url");
233             }
234             if (requestEncoding == null)
235             {
236                 throw new ArgumentNullException("requestEncoding");
237             }
238             HttpWebRequest request = null;
239             try
240             {
241                 //如果是发送HTTPS请求  
242                 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
243                 {
244                     ServicePointManager.ServerCertificateValidationCallback =
245                         new RemoteCertificateValidationCallback(CheckValidationResult);
246                     request = WebRequest.Create(url) as HttpWebRequest;
247                     request.ProtocolVersion = HttpVersion.Version10;
248                 }
249                 else
250                 {
251                     request = WebRequest.Create(url) as HttpWebRequest;
252                 }
253                 request.Method = "POST";
254                 request.ContentType = "application/x-www-form-urlencoded";
255 
256                 if (!string.IsNullOrEmpty(userAgent))
257                 {
258                     request.UserAgent = userAgent;
259                 }
260                 else
261                 {
262                     request.UserAgent = DefaultUserAgent;
263                 }
264 
265                 if (timeout.HasValue)
266                 {
267                     request.Timeout = timeout.Value;
268                 }
269                 if (cookies != null)
270                 {
271                     request.CookieContainer = new CookieContainer();
272                     request.CookieContainer.Add(cookies);
273                 }
274                 //如果需要POST数据  
275                 if (!string.IsNullOrEmpty(parameters))
276                 {
277                     using (var streamWriter = new StreamWriter(request.GetRequestStream()))
278                     {
279                         streamWriter.Write(parameters);
280                         streamWriter.Flush();
281                     }
282                 }
283 
284                 HttpWebResponse httpWebResponse = request.GetResponse() as HttpWebResponse;
285 
286                 StreamReader reader = new StreamReader(httpWebResponse.GetResponseStream(),
287                     System.Text.Encoding.GetEncoding("utf-8"));
288 
289                 string html = "";
290                 //获取请求到的数据
291                 html = reader.ReadToEnd();
292 
293                 //关闭
294                 httpWebResponse.Close();
295                 reader.Close();
296 
297                 callback(html);
298 
299                 return httpWebResponse;
300             }
301             catch
302             {
303                 callback(null);
304             }
305             return null;
306         }
307 
308         private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain,
309             SslPolicyErrors errors)
310         {
311             return true; //总是接受  
312         }
313 
314     }
View Code

使用方法

HttpQuery.Post(url, new { key = key, xmlCount = xmlCount }, (msg) =>
            {
                
            });

 

posted on 2014-12-19 23:12  深海大虾  阅读(500)  评论(1编辑  收藏  举报