HttpHelper.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Net.Security;
  8. using System.Security.Cryptography.X509Certificates;
  9. using System.Text;
  10. namespace CZFW.Core
  11. {
  12. public static class HttpHelper
  13. {
  14. #region POST
  15. /// <summary>
  16. /// HTTP POST方式请求数据
  17. /// </summary>
  18. /// <param name="url">URL.</param>
  19. /// <param name="param">POST的数据</param>
  20. /// <returns></returns>
  21. public static string HttpPost(string url, string param = null)
  22. {
  23. HttpWebRequest request;
  24. //如果是发送HTTPS请求
  25. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  26. {
  27. ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
  28. request = WebRequest.Create(url) as HttpWebRequest;
  29. request.ProtocolVersion = HttpVersion.Version10;
  30. }
  31. else
  32. {
  33. request = WebRequest.Create(url) as HttpWebRequest;
  34. }
  35. request.Method = "POST";
  36. request.ContentType = "application/x-www-form-urlencoded";
  37. request.Accept = "*/*";
  38. request.Timeout = 15000;
  39. request.AllowAutoRedirect = false;
  40. string responseStr;
  41. var requestStream = new StreamWriter(request.GetRequestStream());
  42. requestStream.Write(param);
  43. requestStream.Close();
  44. var response = request.GetResponse();
  45. {
  46. StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  47. responseStr = reader.ReadToEnd();
  48. reader.Close();
  49. }
  50. return responseStr;
  51. }
  52. private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  53. {
  54. return true; //总是接受
  55. }
  56. public static string BuildRequest(string strUrl, Dictionary<string, string> dicPara, string fileName)
  57. {
  58. string contentType = "image/jpeg";
  59. //待请求参数数组
  60. FileStream pic = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  61. byte[] picByte = new byte[pic.Length];
  62. pic.Read(picByte, 0, picByte.Length);
  63. int lengthFile = picByte.Length;
  64. //构造请求地址
  65. //设置HttpWebRequest基本信息
  66. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
  67. //设置请求方式:get、post
  68. request.Method = "POST";
  69. //设置boundaryValue
  70. string boundaryValue = DateTime.Now.Ticks.ToString("x");
  71. string boundary = "--" + boundaryValue;
  72. request.ContentType = "\r\nmultipart/form-data; boundary=" + boundaryValue;
  73. //设置KeepAlive
  74. request.KeepAlive = true;
  75. //设置请求数据,拼接成字符串
  76. StringBuilder sbHtml = new StringBuilder();
  77. foreach (KeyValuePair<string, string> key in dicPara)
  78. {
  79. sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"" + key.Key + "\"\r\n\r\n" + key.Value + "\r\n");
  80. }
  81. sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"");
  82. sbHtml.Append(fileName);
  83. sbHtml.Append("\"\r\nContent-Type: " + contentType + "\r\n\r\n");
  84. string postHeader = sbHtml.ToString();
  85. //将请求数据字符串类型根据编码格式转换成字节流
  86. Encoding code = Encoding.GetEncoding("UTF-8");
  87. byte[] postHeaderBytes = code.GetBytes(postHeader);
  88. byte[] boundayBytes = Encoding.ASCII.GetBytes("\r\n" + boundary + "--\r\n");
  89. //设置长度
  90. long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length;
  91. request.ContentLength = length;
  92. //请求远程HTTP
  93. Stream requestStream = request.GetRequestStream();
  94. //发送数据请求服务器
  95. requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  96. requestStream.Write(picByte, 0, lengthFile);
  97. requestStream.Write(boundayBytes, 0, boundayBytes.Length);
  98. HttpWebResponse httpWResp = (HttpWebResponse)request.GetResponse();
  99. var myStream = httpWResp.GetResponseStream();
  100. //读取处理结果
  101. StreamReader reader = new StreamReader(myStream, code);
  102. StringBuilder responseData = new StringBuilder();
  103. string line;
  104. while ((line = reader.ReadLine()) != null)
  105. {
  106. responseData.Append(line);
  107. }
  108. myStream.Close();
  109. pic.Close();
  110. return responseData.ToString();
  111. }
  112. #endregion
  113. #region Put
  114. /// <summary>
  115. /// HTTP Put方式请求数据.
  116. /// </summary>
  117. /// <param name="url">URL.</param>
  118. /// <param name="param"></param>
  119. /// <returns></returns>
  120. public static string HttpPut(string url, string param = null)
  121. {
  122. HttpWebRequest request;
  123. //如果是发送HTTPS请求
  124. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  125. {
  126. ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
  127. request = WebRequest.Create(url) as HttpWebRequest;
  128. request.ProtocolVersion = HttpVersion.Version10;
  129. }
  130. else
  131. {
  132. request = WebRequest.Create(url) as HttpWebRequest;
  133. }
  134. request.Method = "PUT";
  135. request.ContentType = "application/x-www-form-urlencoded";
  136. request.Accept = "*/*";
  137. request.Timeout = 15000;
  138. request.AllowAutoRedirect = false;
  139. var requestStream = new StreamWriter(request.GetRequestStream());
  140. requestStream.Write(param);
  141. requestStream.Close();
  142. var response = request.GetResponse();
  143. StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  144. var responseStr = reader.ReadToEnd();
  145. reader.Close();
  146. return responseStr;
  147. }
  148. #endregion
  149. #region Delete
  150. /// <summary>
  151. /// HTTP Delete方式请求数据.
  152. /// </summary>
  153. /// <param name="url">URL.</param>
  154. /// <param name="param"></param>
  155. /// <returns></returns>
  156. public static string HttpDelete(string url, string param = null)
  157. {
  158. HttpWebRequest request;
  159. //如果是发送HTTPS请求
  160. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  161. {
  162. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  163. request = WebRequest.Create(url) as HttpWebRequest;
  164. request.ProtocolVersion = HttpVersion.Version10;
  165. }
  166. else
  167. {
  168. request = WebRequest.Create(url) as HttpWebRequest;
  169. }
  170. request.Method = "Delete";
  171. request.ContentType = "application/x-www-form-urlencoded";
  172. request.Accept = "*/*";
  173. request.Timeout = 15000;
  174. request.AllowAutoRedirect = false;
  175. string responseStr;
  176. var requestStream = new StreamWriter(request.GetRequestStream());
  177. requestStream.Write(param);
  178. requestStream.Close();
  179. var response = request.GetResponse();
  180. {
  181. StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  182. responseStr = reader.ReadToEnd();
  183. reader.Close();
  184. }
  185. return responseStr;
  186. }
  187. #endregion
  188. #region Get
  189. /// <summary>
  190. /// HTTP GET方式请求数据.
  191. /// </summary>
  192. /// <param name="url">URL.</param>
  193. /// <param name="headht"></param>
  194. /// <returns></returns>
  195. public static string HttpGet(string url, Hashtable headht = null)
  196. {
  197. HttpWebRequest request;
  198. //如果是发送HTTPS请求
  199. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  200. {
  201. ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
  202. request = WebRequest.Create(url) as HttpWebRequest;
  203. request.ProtocolVersion = HttpVersion.Version10;
  204. }
  205. else
  206. {
  207. request = WebRequest.Create(url) as HttpWebRequest;
  208. }
  209. request.Method = "GET";
  210. //request.ContentType = "application/x-www-form-urlencoded";
  211. request.Accept = "*/*";
  212. request.Timeout = 15000;
  213. request.AllowAutoRedirect = false;
  214. string responseStr;
  215. if (headht != null)
  216. {
  217. foreach (DictionaryEntry item in headht)
  218. {
  219. request.Headers.Add(item.Key.ToString(), item.Value.ToString());
  220. }
  221. }
  222. var response = request.GetResponse();
  223. {
  224. StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  225. responseStr = reader.ReadToEnd();
  226. reader.Close();
  227. }
  228. return responseStr;
  229. }
  230. public static string HttpGet(string url, Encoding encodeing, Hashtable headht = null)
  231. {
  232. HttpWebRequest request;
  233. //如果是发送HTTPS请求
  234. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  235. {
  236. ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult;
  237. request = WebRequest.Create(url) as HttpWebRequest;
  238. request.ProtocolVersion = HttpVersion.Version10;
  239. }
  240. else
  241. {
  242. request = WebRequest.Create(url) as HttpWebRequest;
  243. }
  244. request.Method = "GET";
  245. //request.ContentType = "application/x-www-form-urlencoded";
  246. request.Accept = "*/*";
  247. request.Timeout = 15000;
  248. request.AllowAutoRedirect = false;
  249. string responseStr;
  250. if (headht != null)
  251. {
  252. foreach (DictionaryEntry item in headht)
  253. {
  254. request.Headers.Add(item.Key.ToString(), item.Value.ToString());
  255. }
  256. }
  257. var response = request.GetResponse();
  258. {
  259. StreamReader reader = new StreamReader(response.GetResponseStream(), encodeing);
  260. responseStr = reader.ReadToEnd();
  261. reader.Close();
  262. }
  263. return responseStr;
  264. }
  265. #endregion
  266. #region Post With Pic
  267. /// <summary>
  268. /// HTTP POST方式请求数据(带图片)
  269. /// </summary>
  270. /// <param name="url">URL</param>
  271. /// <param name="param">POST的数据</param>
  272. /// <param name="fileByte">图片</param>
  273. /// <returns></returns>
  274. public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte)
  275. {
  276. string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
  277. byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
  278. HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
  279. wr.ContentType = "multipart/form-data; boundary=" + boundary;
  280. wr.Method = "POST";
  281. wr.KeepAlive = true;
  282. wr.Credentials = CredentialCache.DefaultCredentials;
  283. Stream rs = wr.GetRequestStream();
  284. const string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
  285. foreach (string key in param.Keys)
  286. {
  287. rs.Write(boundarybytes, 0, boundarybytes.Length);
  288. string formitem = string.Format(formdataTemplate, key, param[key]);
  289. byte[] formitembytes = Encoding.UTF8.GetBytes(formitem);
  290. rs.Write(formitembytes, 0, formitembytes.Length);
  291. }
  292. rs.Write(boundarybytes, 0, boundarybytes.Length);
  293. const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
  294. string header = string.Format(headerTemplate, "pic", fileByte, "text/plain");//image/jpeg
  295. byte[] headerbytes = Encoding.UTF8.GetBytes(header);
  296. rs.Write(headerbytes, 0, headerbytes.Length);
  297. rs.Write(fileByte, 0, fileByte.Length);
  298. byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
  299. rs.Write(trailer, 0, trailer.Length);
  300. rs.Close();
  301. var wresp = wr.GetResponse();
  302. Stream stream2 = wresp.GetResponseStream();
  303. StreamReader reader2 = new StreamReader(stream2);
  304. var responseStr = reader2.ReadToEnd();
  305. return responseStr;
  306. }
  307. #endregion
  308. #region HttpsClient
  309. /// <summary>
  310. /// 创建HttpClient
  311. /// </summary>
  312. /// <returns></returns>
  313. public static HttpClient CreateHttpClient(string url)
  314. {
  315. HttpClient httpclient;
  316. //如果是发送HTTPS请求
  317. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  318. {
  319. ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
  320. httpclient = new HttpClient();
  321. }
  322. else
  323. {
  324. httpclient = new HttpClient();
  325. }
  326. return httpclient;
  327. }
  328. #endregion
  329. #region Make
  330. public static dynamic MakeCall(string url, string method, int returnType = 0)
  331. {
  332. HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
  333. if (request == null) return null;
  334. request.Method = method;
  335. request.Timeout = 20000;
  336. var response = request.GetResponse();
  337. var stream = response.GetResponseStream();
  338. if (stream == null) return null;
  339. var reader = new StreamReader(stream);
  340. string responseText = reader.ReadToEnd();
  341. return string.IsNullOrWhiteSpace(responseText) ? null : Json.Deserialize<object>(responseText);
  342. }
  343. public static dynamic MakePost(string url, string message)
  344. {
  345. HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
  346. if (request == null) return null;
  347. request.Method = "POST";
  348. request.ServicePoint.Expect100Continue = false;
  349. request.KeepAlive = true;
  350. Encoding encode = Encoding.GetEncoding("utf-8");
  351. var postdata = message;
  352. request.ContentType = "application/json";
  353. var bytes = encode.GetBytes(postdata);
  354. request.ContentLength = bytes.Length;
  355. try
  356. {
  357. var stream = request.GetRequestStream();
  358. stream.Write(bytes, 0, bytes.Length);
  359. stream.Close();
  360. var response = request.GetResponse();
  361. var resp = response.GetResponseStream();
  362. if (resp == null) return null;
  363. var reader = new StreamReader(resp);
  364. string responseText = reader.ReadToEnd();
  365. resp.Close();
  366. reader.Close();
  367. return responseText;
  368. }
  369. catch (Exception exception)
  370. {
  371. throw;
  372. }
  373. }
  374. #endregion
  375. }
  376. }