HttpUtility.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Net;
  7. namespace DotNet.Utilities
  8. {
  9. #region 调用试例
  10. // static void Main(string[] args)
  11. // {
  12. // string url = "www.baidu.com";
  13. // string param = "<request><param1></param1></request>";
  14. // string method="GET";
  15. // for (int i = 0; i < 1; i++)//发送多条请求看看会不会有问题。
  16. // {
  17. // var result = HttpUtility.Request(method, url, param, onComplete);
  18. // Console.WriteLine("-------------Result----------------");
  19. // Console.WriteLine(result);
  20. // Console.WriteLine("-------------End----------------");
  21. // }
  22. // Console.ReadLine();
  23. // }
  24. // /// <summary>
  25. // /// 请求完成后要执行的操作
  26. // /// </summary>
  27. // /// <param name="code">Http状态码</param>
  28. // /// <param name="result">返回结果</param>
  29. // public static void onComplete(HttpStatusCode code, string result)
  30. // {
  31. // Console.WriteLine("HttpRequest complete! as follow:");
  32. // Console.WriteLine("HttpStatusCode:" + code);
  33. // Console.WriteLine("HttpRequestResult:" + result);
  34. // }
  35. #endregion
  36. /// <summary>
  37. /// Http请求
  38. /// </summary>
  39. public class HttpUtility
  40. {
  41. /// <summary>
  42. ///通用HttpWebRequest
  43. /// </summary>
  44. /// <param name="method">请求方式(POST/GET)</param>
  45. /// <param name="url">请求地址</param>
  46. /// <param name="param">请求参数</param>
  47. /// <param name="onComplete">完成后执行的操作(可选参数,通过此方法可以获取到HTTP状态码)</param>
  48. /// <returns>请求返回的结果</returns>
  49. public static string Request(string method, string url, string param, Action<HttpStatusCode, string> onComplete = null)
  50. {
  51. if (string.IsNullOrEmpty(url))
  52. throw new ArgumentNullException("URL");
  53. switch (method.ToUpper())
  54. {
  55. case "POST":
  56. return Post(url, param, onComplete);
  57. case "GET":
  58. return Get(url, param, onComplete);
  59. default:
  60. throw new EntryPointNotFoundException("method:" + method);
  61. }
  62. }
  63. /// <summary>
  64. /// Post请求
  65. /// </summary>
  66. /// <param name="url">请求地址</param>
  67. /// <param name="param">参数</param>
  68. /// <param name="onComplete">完成后执行的操作(可选参数,通过此方法可以获取到HTTP状态码)</param>
  69. /// <returns>请求返回的结果</returns>
  70. public static string Post(string url, string param, Action<HttpStatusCode, string> onComplete = null)
  71. {
  72. UrlCheck(ref url);
  73. byte[] bufferBytes = Encoding.UTF8.GetBytes(param);
  74. var request = WebRequest.Create(url) as HttpWebRequest;//HttpWebRequest方法继承自WebRequest, Create方法在WebRequest中定义,因此此处要显示的转换
  75. request.Method = "POST";
  76. request.ContentLength = bufferBytes.Length;
  77. request.ContentType = "application/x-www-form-urlencoded";
  78. try
  79. {
  80. using (var requestStream = request.GetRequestStream())
  81. {
  82. requestStream.Write(bufferBytes, 0, bufferBytes.Length);
  83. }
  84. }
  85. catch (WebException ex)
  86. {
  87. return ex.Message;
  88. }
  89. return HttpRequest(request, onComplete);
  90. }
  91. /// <summary>
  92. /// GET请求
  93. /// </summary>
  94. /// <param name="url">请求地址</param>
  95. /// <param name="param">参数</param>
  96. /// <param name="onComplete">完成后执行的操作(可选参数,通过此方法可以获取到HTTP状态码)</param>
  97. /// <returns>请求返回结果</returns>
  98. public static string Get(string url, string param, Action<HttpStatusCode, string> onComplete = null)
  99. {
  100. UrlCheck(ref url);
  101. if (!string.IsNullOrEmpty(param))
  102. if (!param.StartsWith("?"))
  103. param += "?" + param;
  104. else
  105. param += param;
  106. var request = WebRequest.Create(url) as HttpWebRequest;
  107. request.Method = "GET";
  108. request.ContentType = "application/x-www-form-urlencoded";
  109. return HttpRequest(request, onComplete);
  110. }
  111. /// <summary>
  112. /// 请求的主体部分(由此完成请求并返回请求结果)
  113. /// </summary>
  114. /// <param name="request">请求的对象</param>
  115. /// <param name="onComplete">完成后执行的操作(可选参数,通过此方法可以获取到HTTP状态码)</param>
  116. /// <returns>请求返回结果</returns>
  117. private static string HttpRequest(HttpWebRequest request, Action<HttpStatusCode, string> onComplete = null)
  118. {
  119. HttpWebResponse response = null;
  120. try
  121. {
  122. response = request.GetResponse() as HttpWebResponse;
  123. }
  124. catch (WebException ex)
  125. {
  126. response = ex.Response as HttpWebResponse;
  127. }
  128. if (response == null)
  129. {
  130. if (onComplete != null)
  131. onComplete(HttpStatusCode.NotFound, "请求远程返回为空");
  132. return null;
  133. }
  134. string result = string.Empty;
  135. using (StreamReader reader = new StreamReader(response.GetResponseStream()))
  136. {
  137. result = reader.ReadToEnd();
  138. }
  139. if (onComplete != null)
  140. onComplete(response.StatusCode, result);
  141. return result;
  142. }
  143. /// <summary>
  144. /// URL拼写完整性检查
  145. /// </summary>
  146. /// <param name="url">待检查的URL</param>
  147. private static void UrlCheck(ref string url)
  148. {
  149. if (!url.StartsWith("http://") && !url.StartsWith("https://"))
  150. url = "http://" + url;
  151. }
  152. }
  153. }