/// <summary> /// Http请求 /// </summary> /// <param name="url"></param> /// <param name="requestParams"></param> /// <param name="requestType"></param> /// <param name="cookieContainer"></param> /// <param name="referer"></param> /// <param name="contentType"></param> /// <param name="accept"></param> /// <param name="isNeedSleep"></param> /// <param name="host"></param> /// <param name="isEnableFreePrxy"></param> /// <returns></returns> public static DataResult <string> QueryRequest(string url, string requestParams = "", RequestEnum requestType = RequestEnum.GET, CookieContainer cookieContainer = null, string referer = "", string contentType = "", string accept = "", bool isNeedSleep = false, string host = "", bool isEnableFreePrxy = false) { var dataResult = new DataResult <string>(); var retryCount = 2; if (isNeedSleep) { SpinWait.SpinUntil(() => false, TimeSpan.FromSeconds(new Random().Next(1, 2))); } Retry: try { HttpWebRequest httpRequest; if (requestType == RequestEnum.POST) { httpRequest = (HttpWebRequest)WebRequest.Create(url); } else { if (string.IsNullOrWhiteSpace(requestParams)) { httpRequest = (HttpWebRequest)WebRequest.Create(url); } else { httpRequest = (HttpWebRequest)WebRequest.Create(url + "?" + requestParams.Trim()); } } httpRequest.Method = requestType.ToString(); httpRequest.Timeout = 30 * 1000; httpRequest.ContentType = string.IsNullOrWhiteSpace(contentType) ? defaultContentType : contentType; httpRequest.Accept = string.IsNullOrWhiteSpace(accept) ? defaultAccept : accept; httpRequest.Headers.Add("Accept-Encoding", "gzip, deflate"); httpRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; httpRequest.UserAgent = userAgent; httpRequest.CookieContainer = cookieContainer; if (string.IsNullOrEmpty(requestParams)) { httpRequest.ContentLength = 0; } httpRequest.Headers["X-Forwarded-For"] = BaseFanctory.GetRandomIp(); if (!url.IsInnerIP() && (!string.IsNullOrEmpty(host) || isEnableFreePrxy)) { if (!string.IsNullOrEmpty(host)) { var index = host.IndexOf(":", StringComparison.Ordinal); httpRequest.Proxy = new WebProxy(host.Substring(0, index), Convert.ToInt32(host.Substring(index + 1))); } else { var proxy = ProxyFanctory.GetFreeProxy(); httpRequest.Proxy = new WebProxy(proxy.Ip, proxy.Port); } } if (!string.IsNullOrWhiteSpace(referer)) { httpRequest.Referer = referer; } if (requestType == RequestEnum.POST && !string.IsNullOrWhiteSpace(requestParams)) { var encoding = Encoding.GetEncoding("utf-8"); var bytesToPost = encoding.GetBytes(requestParams); httpRequest.ContentLength = bytesToPost.Length; var requestStream = httpRequest.GetRequestStream(); requestStream.Write(bytesToPost, 0, bytesToPost.Length); requestStream.Close(); } var response = (HttpWebResponse)httpRequest.GetResponse(); var stream = response.GetResponseStream(); var reStr = string.Empty; if (stream != null) { var sr = new StreamReader(stream, Encoding.GetEncoding("utf-8")); reStr = sr.ReadToEnd(); sr.Close(); } else { dataResult.IsSuccess = false; } response.Close(); dataResult.Data = reStr; return(dataResult); } catch (WebException ex) { if (isEnableFreePrxy) { ProxyFanctory.NextProxy(); } if (string.IsNullOrWhiteSpace(host) && --retryCount >= 0) { if (ex.Status == WebExceptionStatus.ProtocolError) { SpinWait.SpinUntil(() => false, TimeSpan.FromSeconds(2)); } goto Retry; } dataResult.IsSuccess = false; var hostStr = !string.IsNullOrEmpty(host) ? "Host:" + host : ""; dataResult.ErrorMsg = $"Web响应异常,请求Url:{url},{hostStr} 异常信息:{ex.Message}"; return(dataResult); } catch (Exception ex) { var hostStr = !string.IsNullOrEmpty(host) ? "Host:" + host : ""; LogFactory.Error($"请求异常!请求Url:{url} 请求参数:{requestParams} {hostStr} {Environment.NewLine}异常信息:{ex.Message}{Environment.NewLine}{ex.StackTrace}"); dataResult.IsSuccess = false; dataResult.ErrorMsg = $"请求异常!请求Url:{url} {hostStr} 异常信息:{ex.Message} 详情请错误看日志!"; return(dataResult); } }
/// <summary> /// HttpClient 请求 /// </summary> /// <param name="url"></param> /// <param name="method"></param> /// <param name="dictionary"></param> /// <param name="cookieContainer"></param> /// <param name="referer"></param> /// <param name="contentType"></param> /// <param name="accept"></param> /// <param name="userAgent"></param> /// <param name="isRandomIP"></param> /// <param name="webProxy"></param> /// <returns></returns> private static DataResult <HttpContent> Request(string url, HttpMethod method, IEnumerable <KeyValuePair <string, string> > dictionary = null, CookieContainer cookieContainer = null, string referer = "", string contentType = "", string accept = "", string userAgent = "", bool isRandomIP = false, IWebProxy webProxy = null) { var dataResult = new DataResult <HttpContent>(); if (url.Contains("https")) { ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true; } try { using (var client = new HttpClient(new HttpClientHandler { CookieContainer = cookieContainer ?? new CookieContainer(), Proxy = webProxy, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate | DecompressionMethods.None })) { client.DefaultRequestHeaders.Add("Accept", string.IsNullOrWhiteSpace(accept) ? defaultAccept : accept); client.DefaultRequestHeaders.Add("User-Agent", string.IsNullOrWhiteSpace(userAgent) ? defaultUserAgent : userAgent); //if (isRandomIP) client.DefaultRequestHeaders.Add("X-Forwarded-For", BaseFanctory.GetRandomHost()); if (!string.IsNullOrEmpty(referer)) { client.DefaultRequestHeaders.Add("Referer", referer); } var httpRequestMessage = new HttpRequestMessage(method, new Uri(url)); if (method == HttpMethod.Post && dictionary != null) { var httpContent = new FormUrlEncodedContent(dictionary); httpContent.Headers.ContentType = new MediaTypeHeaderValue(string.IsNullOrEmpty(contentType) ? defaultContentType : contentType); httpRequestMessage.Content = httpContent; } dataResult.Data = client.SendAsync(httpRequestMessage).Result.Content; return(dataResult); } } catch (WebException ex) { dataResult.IsSuccess = false; dataResult.ErrorMsg = $"Web响应异常,请求Url:{url},{JsonConvert.SerializeObject(dictionary)} 异常信息:{ex.Message}"; return(dataResult); } catch (Exception ex) { while (true) { if (ex.InnerException == null) { break; } ex = ex.InnerException; } LogFactory.Error($"请求异常!请求Url:{url} 请求参数:{JsonConvert.SerializeObject(dictionary)} {Environment.NewLine}异常信息:{ex.Message}{Environment.NewLine}{ex.StackTrace}"); dataResult.IsSuccess = false; dataResult.ErrorMsg = $"请求异常!请求Url:{url} 异常信息:{ex.Message} 详情请错误看日志!"; return(dataResult); } finally { if (cookieContainer != null) { cookieContainer.GetAllCookies().Select(s => s.Domain).Distinct().ToList().ForEach(f => { foreach (var cookie in cookieContainer.GetCookies(new Uri("http://www" + f)).OfType <Cookie>()) { cookie.Expired = false; } }); _cookieContainer.GetAllCookies().ForEach(cookieContainer.Add); } } }
/// <summary> /// 下载文件 /// </summary> /// <param name="url"></param> /// <param name="path"></param> /// <param name="requestParams"></param> /// <param name="cookieContainer"></param> /// <returns></returns> public static DataResult HttpDownloadFile(string url, string path, string requestParams = "", CookieContainer cookieContainer = null) { var dataResult = new DataResult(); try { var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.ContentType = "application/x-www-form-urlencoded"; httpRequest.Headers["Upgrade-Insecure-Requests"] = "1"; httpRequest.Method = "POST"; httpRequest.ContentLength = 0; httpRequest.CookieContainer = cookieContainer; httpRequest.Headers.Add("Accept-Encoding", "gzip, deflate"); httpRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; httpRequest.UserAgent = userAgent; httpRequest.Accept = defaultAccept; if (!string.IsNullOrWhiteSpace(requestParams)) { var encoding = Encoding.GetEncoding("utf-8"); var bytesToPost = encoding.GetBytes(requestParams); httpRequest.ContentLength = bytesToPost.Length; var requestStream = httpRequest.GetRequestStream(); requestStream.Write(bytesToPost, 0, bytesToPost.Length); requestStream.Close(); } using (var response = httpRequest.GetResponse()) { using (var responseStream = response.GetResponseStream()) { var bArr = new byte[1024]; if (responseStream != null) { var size = responseStream.Read(bArr, 0, bArr.Length); while (size > 0) { fs.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, bArr.Length); } responseStream.Close(); } fs.Close(); } } } catch (Exception ex) { LogFactory.Error($"下载异常,请求Url:{url},{Environment.NewLine}异常信息:{ex.Message}{Environment.NewLine}{ex.StackTrace}"); dataResult.IsSuccess = false; dataResult.ErrorMsg = $"请求异常,请求Url:{url},异常信息:{ex.Message},详情请错误看日志!"; } return(dataResult); }