You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

600 lines
22 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Net.Security;
  6. using System.Security.Cryptography.X509Certificates;
  7. using System.Text;
  8. namespace Learun.Application.WeChat
  9. {
  10. public class HttpHelper
  11. {
  12. public bool Debug { get; set; }
  13. public CookieCollection Cookies
  14. {
  15. get { return _cookies; }
  16. }
  17. public void ClearCookies()
  18. {
  19. _cookies = new CookieCollection();
  20. }
  21. CookieCollection _cookies = new CookieCollection();
  22. private static readonly string DefaultUserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
  23. /// <summary>
  24. /// 创建GET方式的HTTP请求
  25. /// </summary>
  26. /// <param name="url">请求的URL</param>
  27. /// <param name="timeout">请求的超时时间</param>
  28. /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
  29. /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
  30. /// <returns></returns>
  31. public HttpWebResponse CreateGetHttpResponse(string url, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  32. {
  33. if (Debug)
  34. {
  35. Console.Write("Start Get Url:{0} ", url);
  36. }
  37. if (string.IsNullOrEmpty(url))
  38. {
  39. throw new ArgumentNullException("url");
  40. }
  41. HttpWebRequest request;
  42. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  43. {
  44. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  45. request = WebRequest.Create(url) as HttpWebRequest;
  46. request.ProtocolVersion = HttpVersion.Version10;
  47. }
  48. else
  49. {
  50. request = WebRequest.Create(url) as HttpWebRequest;
  51. }
  52. request.Method = "GET";
  53. request.Headers["Pragma"] = "no-cache";
  54. request.Accept = "text/html, application/xhtml+xml, */*";
  55. request.Headers["Accept-Language"] = "en-US,en;q=0.5";
  56. request.ContentType = "application/x-www-form-urlencoded";
  57. request.UserAgent = DefaultUserAgent;
  58. request.Referer = Referer;
  59. if (headers != null)
  60. {
  61. foreach (var header in headers)
  62. {
  63. request.Headers.Add(header.Key, header.Value);
  64. }
  65. }
  66. if (!string.IsNullOrEmpty(userAgent))
  67. {
  68. request.UserAgent = userAgent;
  69. }
  70. if (timeout.HasValue)
  71. {
  72. request.Timeout = timeout.Value * 1000;
  73. }
  74. if (cookies != null)
  75. {
  76. request.CookieContainer = new CookieContainer();
  77. request.CookieContainer.Add(cookies);
  78. }
  79. else
  80. {
  81. request.CookieContainer = new CookieContainer();
  82. request.CookieContainer.Add(Cookies);
  83. }
  84. var v = request.GetResponse() as HttpWebResponse;
  85. Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
  86. Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
  87. Cookies.Add(v.Cookies);
  88. if (Debug)
  89. {
  90. Console.WriteLine("OK");
  91. }
  92. return v;
  93. }
  94. /// <summary>
  95. /// 创建POST方式的HTTP请求
  96. /// </summary>
  97. /// <param name="url">请求的URL</param>
  98. /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
  99. /// <param name="timeout">请求的超时时间</param>
  100. /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
  101. /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
  102. /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
  103. /// <returns></returns>
  104. public HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  105. {
  106. if (Debug)
  107. {
  108. Console.Write("Start Post Url:{0} ", url);
  109. foreach (KeyValuePair<string, string> keyValuePair in parameters)
  110. {
  111. Console.Write(",{0}:{1}", keyValuePair.Key, keyValuePair.Value);
  112. }
  113. }
  114. if (string.IsNullOrEmpty(url))
  115. {
  116. throw new ArgumentNullException("url");
  117. }
  118. if (requestEncoding == null)
  119. {
  120. throw new ArgumentNullException("requestEncoding");
  121. }
  122. HttpWebRequest request = null;
  123. //如果是发送HTTPS请求
  124. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  125. {
  126. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(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 = "POST";
  135. request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
  136. request.Referer = Referer;
  137. request.Headers["Accept-Language"] = "en-US,en;q=0.5";
  138. request.UserAgent = DefaultUserAgent;
  139. request.ContentType = "application/x-www-form-urlencoded";
  140. request.Headers["Pragma"] = "no-cache";
  141. if (headers != null)
  142. {
  143. foreach (var header in headers)
  144. {
  145. request.Headers.Add(header.Key, header.Value);
  146. }
  147. }
  148. if (cookies != null)
  149. {
  150. request.CookieContainer = new CookieContainer();
  151. request.CookieContainer.Add(cookies);
  152. }
  153. else
  154. {
  155. request.CookieContainer = new CookieContainer();
  156. request.CookieContainer.Add(Cookies);
  157. }
  158. if (!string.IsNullOrEmpty(userAgent))
  159. {
  160. request.UserAgent = userAgent;
  161. }
  162. else
  163. {
  164. request.UserAgent = DefaultUserAgent;
  165. }
  166. if (timeout.HasValue)
  167. {
  168. request.Timeout = timeout.Value * 1000;
  169. }
  170. request.Expect = string.Empty;
  171. //如果需要POST数据
  172. if (!(parameters == null || parameters.Count == 0))
  173. {
  174. var buffer = CraeteParameter(parameters);
  175. byte[] data = requestEncoding.GetBytes(buffer.ToString());
  176. using (Stream stream = request.GetRequestStream())
  177. {
  178. stream.Write(data, 0, data.Length);
  179. }
  180. }
  181. var v = request.GetResponse() as HttpWebResponse;
  182. Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
  183. Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
  184. Cookies.Add(v.Cookies);
  185. if (Debug)
  186. {
  187. Console.WriteLine("OK");
  188. }
  189. return v;
  190. }
  191. /// <summary>
  192. /// 创建POST方式的HTTP请求
  193. /// </summary>
  194. /// <param name="url">请求的URL</param>
  195. /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
  196. /// <param name="timeout">请求的超时时间</param>
  197. /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
  198. /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
  199. /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
  200. /// <returns></returns>
  201. public HttpWebResponse CreatePostHttpResponse(string url, string parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  202. {
  203. if (Debug)
  204. {
  205. Console.Write("Start Post Url:{0} ,parameters:{1} ", url, parameters);
  206. }
  207. if (string.IsNullOrEmpty(url))
  208. {
  209. throw new ArgumentNullException("url");
  210. }
  211. if (requestEncoding == null)
  212. {
  213. throw new ArgumentNullException("requestEncoding");
  214. }
  215. HttpWebRequest request = null;
  216. //如果是发送HTTPS请求
  217. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  218. {
  219. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  220. request = WebRequest.Create(url) as HttpWebRequest;
  221. request.ProtocolVersion = HttpVersion.Version10;
  222. }
  223. else
  224. {
  225. request = WebRequest.Create(url) as HttpWebRequest;
  226. }
  227. request.Method = "POST";
  228. request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5");
  229. request.Method = "POST";
  230. request.Accept = "text/html, application/xhtml+xml, */*";
  231. request.Referer = Referer;
  232. request.Headers["Accept-Language"] = "en-US,en;q=0.5";
  233. request.UserAgent = DefaultUserAgent;
  234. request.ContentType = "application/x-www-form-urlencoded";
  235. request.Headers["Pragma"] = "no-cache";
  236. if (cookies != null)
  237. {
  238. request.CookieContainer = new CookieContainer();
  239. request.CookieContainer.Add(cookies);
  240. }
  241. else
  242. {
  243. request.CookieContainer = new CookieContainer();
  244. request.CookieContainer.Add(Cookies);
  245. }
  246. if (headers != null)
  247. {
  248. foreach (var header in headers)
  249. {
  250. request.Headers.Add(header.Key, header.Value);
  251. }
  252. }
  253. if (!string.IsNullOrEmpty(userAgent))
  254. {
  255. request.UserAgent = userAgent;
  256. }
  257. else
  258. {
  259. request.UserAgent = DefaultUserAgent;
  260. }
  261. if (timeout.HasValue)
  262. {
  263. request.Timeout = timeout.Value * 1000;
  264. }
  265. request.Expect = string.Empty;
  266. //如果需要POST数据
  267. if (!string.IsNullOrEmpty(parameters))
  268. {
  269. byte[] data = requestEncoding.GetBytes(parameters);
  270. using (Stream stream = request.GetRequestStream())
  271. {
  272. stream.Write(data, 0, data.Length);
  273. }
  274. }
  275. var v = request.GetResponse() as HttpWebResponse;
  276. Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
  277. Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
  278. Cookies.Add(v.Cookies);
  279. if (Debug)
  280. {
  281. Console.WriteLine("OK");
  282. }
  283. return v;
  284. }
  285. /// <summary>
  286. /// 创建POST方式的HTTP请求
  287. /// </summary>
  288. /// <param name="url">请求的URL</param>
  289. /// <param name="parameters">随同请求POST的参数名称及参数值字典</param>
  290. /// <param name="timeout">请求的超时时间</param>
  291. /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param>
  292. /// <param name="requestEncoding">发送HTTP请求时所用的编码</param>
  293. /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param>
  294. /// <returns></returns>
  295. public HttpWebResponse CreatePostFileHttpResponse(string url, string filePath, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  296. {
  297. if (Debug)
  298. {
  299. Console.Write("Start Post Url:{0} ", url);
  300. }
  301. if (string.IsNullOrEmpty(url))
  302. {
  303. throw new ArgumentNullException("url");
  304. }
  305. HttpWebRequest request = null;
  306. //如果是发送HTTPS请求
  307. if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  308. {
  309. ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  310. request = WebRequest.Create(url) as HttpWebRequest;
  311. request.ProtocolVersion = HttpVersion.Version10;
  312. }
  313. else
  314. {
  315. request = WebRequest.Create(url) as HttpWebRequest;
  316. }
  317. request.Method = "POST";
  318. request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01";
  319. request.Referer = Referer;
  320. request.Headers["Accept-Language"] = "en-US,en;q=0.5";
  321. request.UserAgent = DefaultUserAgent;
  322. request.ContentType = "application/x-www-form-urlencoded";
  323. request.Headers["Pragma"] = "no-cache";
  324. if (headers != null)
  325. {
  326. foreach (var header in headers)
  327. {
  328. request.Headers.Add(header.Key, header.Value);
  329. }
  330. }
  331. if (cookies != null)
  332. {
  333. request.CookieContainer = new CookieContainer();
  334. request.CookieContainer.Add(cookies);
  335. }
  336. else
  337. {
  338. request.CookieContainer = new CookieContainer();
  339. request.CookieContainer.Add(Cookies);
  340. }
  341. if (!string.IsNullOrEmpty(userAgent))
  342. {
  343. request.UserAgent = userAgent;
  344. }
  345. else
  346. {
  347. request.UserAgent = DefaultUserAgent;
  348. }
  349. if (timeout.HasValue)
  350. {
  351. request.Timeout = timeout.Value * 1000;
  352. }
  353. request.Expect = string.Empty;
  354. //如果需要POST数据
  355. if (!string.IsNullOrEmpty(filePath))
  356. {
  357. using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
  358. {
  359. BinaryReader r = new BinaryReader(fs);
  360. //时间戳
  361. string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x");
  362. byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n");
  363. //请求头部信息
  364. StringBuilder sb = new StringBuilder();
  365. sb.Append("--");
  366. sb.Append(strBoundary);
  367. sb.Append("\r\n");
  368. sb.Append("Content-Disposition: form-data; name=\"");
  369. sb.Append("file");
  370. sb.Append("\"; filename=\"");
  371. sb.Append(fs.Name);
  372. sb.Append("\"");
  373. sb.Append("\r\n");
  374. sb.Append("Content-Type: ");
  375. sb.Append("application/octet-stream");
  376. sb.Append("\r\n");
  377. sb.Append("\r\n");
  378. string strPostHeader = sb.ToString();
  379. byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader);
  380. request.ContentType = "multipart/form-data; boundary=" + strBoundary;
  381. long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length;
  382. request.ContentLength = length;
  383. //开始上传时间
  384. DateTime startTime = DateTime.Now;
  385. byte[] filecontent = new byte[fs.Length];
  386. fs.Read(filecontent, 0, filecontent.Length);
  387. using (Stream stream = request.GetRequestStream())
  388. {
  389. //发送请求头部消息
  390. stream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
  391. stream.Write(filecontent, 0, filecontent.Length);
  392. //添加尾部的时间戳
  393. stream.Write(boundaryBytes, 0, boundaryBytes.Length);
  394. }
  395. }
  396. }
  397. var v = request.GetResponse() as HttpWebResponse;
  398. Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host)));
  399. Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host)));
  400. Cookies.Add(v.Cookies);
  401. if (Debug)
  402. {
  403. Console.WriteLine("OK");
  404. }
  405. return v;
  406. }
  407. public static string CraeteParameter(IDictionary<string, string> parameters)
  408. {
  409. StringBuilder buffer = new StringBuilder();
  410. foreach (string key in parameters.Keys)
  411. {
  412. buffer.AppendFormat("&{0}={1}", key, parameters[key]);
  413. }
  414. return buffer.ToString().TrimStart('&');
  415. }
  416. private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  417. {
  418. return true; //总是接受
  419. }
  420. public string Post(string url, IDictionary<string, string> parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  421. {
  422. HttpWebResponse response = CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers);
  423. try
  424. {
  425. using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding))
  426. {
  427. return reader.ReadToEnd();
  428. }
  429. }
  430. catch (Exception)
  431. {
  432. return null;
  433. }
  434. }
  435. public string Post(string url, string parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  436. {
  437. HttpWebResponse response = CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers);
  438. try
  439. {
  440. using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding))
  441. {
  442. return reader.ReadToEnd();
  443. }
  444. }
  445. catch (Exception)
  446. {
  447. return null;
  448. }
  449. }
  450. public string PostFile(string url, string filePath, Encoding responseEncoding,
  451. int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "",
  452. Dictionary<string, string> headers = null)
  453. {
  454. HttpWebResponse response = CreatePostFileHttpResponse(url, filePath, timeout, userAgent, cookies, Referer,
  455. headers);
  456. try
  457. {
  458. using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding))
  459. {
  460. return reader.ReadToEnd();
  461. }
  462. }
  463. catch (Exception)
  464. {
  465. return null;
  466. }
  467. }
  468. public string Get(string url, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  469. {
  470. HttpWebResponse response = CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers);
  471. try
  472. {
  473. using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding))
  474. {
  475. return reader.ReadToEnd();
  476. }
  477. }
  478. catch (Exception)
  479. {
  480. return null;
  481. }
  482. }
  483. public byte[] GetFile(string url, out Dictionary<string, string> header, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null)
  484. {
  485. HttpWebResponse response = CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers);
  486. header = new Dictionary<string, string>();
  487. foreach (string key in response.Headers.AllKeys)
  488. {
  489. header.Add(key, response.Headers[key]);
  490. }
  491. try
  492. {
  493. System.IO.Stream st = response.GetResponseStream();
  494. byte[] by = new byte[response.ContentLength];
  495. st.Read(by, 0, by.Length);
  496. st.Close();
  497. return by;
  498. }
  499. catch (Exception)
  500. {
  501. return null;
  502. }
  503. }
  504. }
  505. }