AliyunWebUtils.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Security;
  7. using System.Security.Cryptography.X509Certificates;
  8. using System.Text;
  9. using System.Web;
  10. using Top.Api.Util;
  11. namespace Aliyun.Api.Util
  12. {
  13. public class AliyunWebUtils
  14. {
  15. private int _timeout = 100000;
  16. /// <summary>
  17. /// 请求与响应的超时时间
  18. /// </summary>
  19. public int Timeout
  20. {
  21. get { return this._timeout; }
  22. set { this._timeout = value; }
  23. }
  24. /// <summary>
  25. /// 执行HTTP POST请求。
  26. /// </summary>
  27. /// <param name="url">请求地址</param>
  28. /// <param name="parameters">请求参数</param>
  29. /// <returns>HTTP响应</returns>
  30. public string DoPost(string url, IDictionary<string, string> parameters)
  31. {
  32. HttpWebRequest req = GetWebRequest(url, "POST");
  33. req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
  34. byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(parameters));
  35. System.IO.Stream reqStream = req.GetRequestStream();
  36. reqStream.Write(postData, 0, postData.Length);
  37. reqStream.Close();
  38. HttpWebResponse rsp = null;
  39. try
  40. {
  41. rsp = (HttpWebResponse)req.GetResponse();
  42. }
  43. catch (WebException ex)
  44. {
  45. WebResponse wr = ex.Response;
  46. System.IO.Stream st = wr.GetResponseStream();
  47. StreamReader sr = new StreamReader(st, System.Text.Encoding.Default);
  48. string sError = sr.ReadToEnd();
  49. sr.Close();
  50. st.Close();
  51. return sError;
  52. }
  53. Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
  54. return GetResponseAsString(rsp, encoding);
  55. }
  56. /// <summary>
  57. /// 执行HTTP GET请求。
  58. /// </summary>
  59. /// <param name="url">请求地址</param>
  60. /// <param name="parameters">请求参数</param>
  61. /// <returns>HTTP响应</returns>
  62. public string DoGet(string url, IDictionary<string, string> parameters)
  63. {
  64. if (parameters != null && parameters.Count > 0)
  65. {
  66. if (url.Contains("?"))
  67. {
  68. url = url + "&" + BuildQuery(parameters);
  69. }
  70. else
  71. {
  72. url = url + "?" + BuildQuery(parameters);
  73. }
  74. }
  75. HttpWebRequest req = GetWebRequest(url, "GET");
  76. req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
  77. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  78. Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
  79. return GetResponseAsString(rsp, encoding);
  80. }
  81. /// <summary>
  82. /// 执行带文件上传的HTTP POST请求。
  83. /// </summary>
  84. /// <param name="url">请求地址</param>
  85. /// <param name="textParams">请求文本参数</param>
  86. /// <param name="fileParams">请求文件参数</param>
  87. /// <returns>HTTP响应</returns>
  88. public string DoPost(string url, IDictionary<string, string> textParams, IDictionary<string, FileItem> fileParams)
  89. {
  90. // 如果没有文件参数,则走普通POST请求
  91. if (fileParams == null || fileParams.Count == 0)
  92. {
  93. return DoPost(url, textParams);
  94. }
  95. string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线
  96. HttpWebRequest req = GetWebRequest(url, "POST");
  97. req.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
  98. System.IO.Stream reqStream = req.GetRequestStream();
  99. byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");
  100. byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
  101. // 组装文本请求参数
  102. string textTemplate = "Content-Disposition:form-data;name=\"{0}\"\r\nContent-Type:text/plain\r\n\r\n{1}";
  103. IEnumerator<KeyValuePair<string, string>> textEnum = textParams.GetEnumerator();
  104. while (textEnum.MoveNext())
  105. {
  106. string textEntry = string.Format(textTemplate, textEnum.Current.Key, textEnum.Current.Value);
  107. byte[] itemBytes = Encoding.UTF8.GetBytes(textEntry);
  108. reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
  109. reqStream.Write(itemBytes, 0, itemBytes.Length);
  110. }
  111. // 组装文件请求参数
  112. string fileTemplate = "Content-Disposition:form-data;name=\"{0}\";filename=\"{1}\"\r\nContent-Type:{2}\r\n\r\n";
  113. IEnumerator<KeyValuePair<string, FileItem>> fileEnum = fileParams.GetEnumerator();
  114. while (fileEnum.MoveNext())
  115. {
  116. string key = fileEnum.Current.Key;
  117. FileItem fileItem = fileEnum.Current.Value;
  118. if (!fileItem.IsValid())
  119. {
  120. throw new ArgumentException("FileItem is invalid");
  121. }
  122. string fileEntry = string.Format(fileTemplate, key, fileItem.GetFileName(), fileItem.GetMimeType());
  123. byte[] itemBytes = Encoding.UTF8.GetBytes(fileEntry);
  124. reqStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
  125. reqStream.Write(itemBytes, 0, itemBytes.Length);
  126. fileItem.Write(reqStream);
  127. }
  128. reqStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
  129. reqStream.Close();
  130. HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
  131. Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
  132. return GetResponseAsString(rsp, encoding);
  133. }
  134. public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  135. { //直接确认,否则打不开
  136. return true;
  137. }
  138. public HttpWebRequest GetWebRequest(string url, string method)
  139. {
  140. HttpWebRequest req = null;
  141. if (url.Contains("https"))
  142. {
  143. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  144. req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
  145. }
  146. else
  147. {
  148. req = (HttpWebRequest)WebRequest.Create(url);
  149. }
  150. req.ServicePoint.Expect100Continue = false;
  151. req.Method = method;
  152. req.KeepAlive = true;
  153. req.UserAgent = "Top4Net";
  154. req.Timeout = this._timeout;
  155. return req;
  156. }
  157. /// <summary>
  158. /// 把响应流转换为文本。
  159. /// </summary>
  160. /// <param name="rsp">响应流对象</param>
  161. /// <param name="encoding">编码方式</param>
  162. /// <returns>响应文本</returns>
  163. public string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
  164. {
  165. System.IO.Stream stream = null;
  166. StreamReader reader = null;
  167. try
  168. {
  169. // 以字符流的方式读取HTTP响应
  170. stream = rsp.GetResponseStream();
  171. reader = new StreamReader(stream, encoding);
  172. return reader.ReadToEnd();
  173. }
  174. finally
  175. {
  176. // 释放资源
  177. if (reader != null) reader.Close();
  178. if (stream != null) stream.Close();
  179. if (rsp != null) rsp.Close();
  180. }
  181. }
  182. /// <summary>
  183. /// 组装GET请求URL。
  184. /// </summary>
  185. /// <param name="url">请求地址</param>
  186. /// <param name="parameters">请求参数</param>
  187. /// <returns>带参数的GET请求URL</returns>
  188. public string BuildGetUrl(string url, IDictionary<string, string> parameters)
  189. {
  190. if (parameters != null && parameters.Count > 0)
  191. {
  192. if (url.Contains("?"))
  193. {
  194. url = url + "&" + BuildQuery(parameters);
  195. }
  196. else
  197. {
  198. url = url + "?" + BuildQuery(parameters);
  199. }
  200. }
  201. return url;
  202. }
  203. /// <summary>
  204. /// 组装普通文本请求参数。
  205. /// </summary>
  206. /// <param name="parameters">Key-Value形式请求参数字典</param>
  207. /// <returns>URL编码后的请求数据</returns>
  208. public static string BuildQuery(IDictionary<string, string> parameters)
  209. {
  210. StringBuilder postData = new StringBuilder();
  211. bool hasParam = false;
  212. IEnumerator<KeyValuePair<string, string>> dem = parameters.GetEnumerator();
  213. while (dem.MoveNext())
  214. {
  215. string name = dem.Current.Key;
  216. string value = dem.Current.Value;
  217. // 忽略参数名或参数值为空的参数
  218. if (!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(value))
  219. {
  220. if (hasParam)
  221. {
  222. postData.Append("&");
  223. }
  224. postData.Append(name);
  225. postData.Append("=");
  226. postData.Append(HttpUtility.UrlEncode(value, Encoding.UTF8));
  227. hasParam = true;
  228. }
  229. }
  230. return postData.ToString();
  231. }
  232. }
  233. }