using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; namespace Common.system { using XHWK.WKTool.system; /// /// HttpHelper /// 创建人:赵耀 /// public class HttpHelper { public static void init_Request(ref System.Net.HttpWebRequest request) { request.Accept = "text/json,*/*;q=0.5"; request.Headers.Add("Accept-Charset", "utf-8;q=0.7,*;q=0.7"); request.Headers.Add("Accept-Encoding", "gzip, deflate, x-gzip, identity; q=0.9"); request.AutomaticDecompression = System.Net.DecompressionMethods.GZip; request.Timeout = 8000; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受 } public static System.Net.HttpWebRequest GetHttpWebRequest(string url) { HttpWebRequest request = null; if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } return request; } public static WebResponse Download(string downloadUrl, long from, long to, string method) { for (int i = 0; i < 10; i++) { try { HttpWebRequest request = HttpHelper.GetHttpWebRequest(downloadUrl); HttpHelper.init_Request(ref request); request.Accept = "text/json,*/*;q=0.5"; request.AddRange(from, to); request.Headers.Add("Accept-Charset", "utf-8;q=0.7,*;q=0.7"); request.Headers.Add("Accept-Encoding", "gzip, deflate, x-gzip, identity; q=0.9"); request.AutomaticDecompression = System.Net.DecompressionMethods.GZip; request.Timeout = 120000; request.Method = method; request.KeepAlive = false; request.ContentType = "application/json; charset=utf-8"; return request.GetResponse(); } catch (Exception) { Thread.Sleep(100); } } throw new Exception("已断开网络!请检查网络连接后重试下载!"); } public static string Get(string url, IDictionary param) { List paramBuilder = new List(); foreach (KeyValuePair item in param) { paramBuilder.Add(string.Format("{0}={1}", item.Key, item.Value)); } url = string.Format("{0}?{1}", url.TrimEnd('?'), string.Join(",", paramBuilder.ToArray())); return Get(url); } public static string Get(string url) { try { HttpWebRequest request = GetHttpWebRequest(url); if (request != null) { string retval = null; init_Request(ref request); using (WebResponse Response = request.GetResponse()) { using (StreamReader reader = new System.IO.StreamReader(Response.GetResponseStream(), System.Text.Encoding.UTF8)) { retval = reader.ReadToEnd(); } } return retval; } } catch { } return null; } public static string Post(string url, string data) { try { HttpWebRequest request = GetHttpWebRequest(url); if (request != null) { string retval = null; init_Request(ref request); request.Method = "POST"; request.ServicePoint.Expect100Continue = false; request.ContentType = "application/json; charset=utf-8"; request.Timeout = 5000; byte[] bytes = System.Text.UTF8Encoding.UTF8.GetBytes(data); request.ContentLength = bytes.Length; using (Stream stream = request.GetRequestStream()) { stream.Write(bytes, 0, bytes.Length); } using (WebResponse response = request.GetResponse()) { using (StreamReader reader = new System.IO.StreamReader(response.GetResponseStream())) { retval = reader.ReadToEnd(); } } return retval; } } catch { } return null; } /// ///调用Post接口 /// /// /// public static string HttpPost(string body, string Url) { try { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.Accept = "text/html,application/xhtml+xml,*/*"; request.ContentType = "application/json"; string postDataAES = body; bool IsParameterEncryption = FileToolsCommon.GetConfigValue("IsParameterEncryption") != "0"; if (IsParameterEncryption) { postDataAES = AESHelper.AESEncrypt(body, "XINGHUOLIAOYUAN7"); } byte[] buffer = encoding.GetBytes(postDataAES); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } catch (Exception ex) { // LogHelper.Instance.Debug($"POST接口连接失败,请求参数:{ex.Message}"); return "POST报错:" + ex.Message; } } /// /// Post Http请求 /// /// 请求地址 /// 传输数据 /// 超时时间 /// 媒体格式 /// 编码 /// 泛型集合 public static T PostAndRespSignle(string url, int timeout = 5000, string postData = "", string contentType = "application/json;", string encode = "UTF-8") where T : class { if (!string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(encode) && !string.IsNullOrEmpty(contentType) && postData != null) { // webRequest.Headers.Add("Authorization", "Bearer " + "SportApiAuthData"); HttpWebResponse webResponse = null; Stream responseStream = null; Stream requestStream = null; StreamReader streamReader = null; try { string postDataAES = postData; bool IsParameterEncryption = FileToolsCommon.GetConfigValue("IsParameterEncryption") != "0"; if (IsParameterEncryption) { postDataAES = AESHelper.AESEncrypt(postData, "XINGHUOLIAOYUAN7"); } string respstr = GetStreamReader(url, responseStream, requestStream, streamReader, webResponse, timeout, encode, postDataAES, contentType); return JsonHelper.JsonToObj(respstr); } catch (Exception) { } finally { if (responseStream != null) { responseStream.Dispose(); } if (webResponse != null) { webResponse.Close(); } if (requestStream != null) { requestStream.Dispose(); } if (streamReader != null) { streamReader.Dispose(); } } } return default(T); } private static string GetStreamReader(string url, Stream responseStream, Stream requestStream, StreamReader streamReader, WebResponse webResponse, int timeout, string encode, string postData, string contentType) { try { byte[] data = Encoding.GetEncoding(encode).GetBytes(postData); HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = "POST"; webRequest.ContentType = contentType + ";" + encode; webRequest.ContentLength = data.Length; webRequest.Timeout = timeout; requestStream = webRequest.GetRequestStream(); requestStream.Write(data, 0, data.Length); webResponse = (HttpWebResponse)webRequest.GetResponse(); responseStream = webResponse.GetResponseStream(); if (responseStream == null) { return ""; } streamReader = new StreamReader(responseStream, Encoding.GetEncoding(encode)); return streamReader.ReadToEnd(); } catch (Exception) { return null; } } /// /// Cookie /// public static CookieContainer cc = new CookieContainer(); /// /// Get请求 /// /// 请求地址 /// 头 /// 参数 /// token /// public static JObject GetFunction(string serviceaddress, string strcontent, string contenttype, string header, int Timeout = 5000) { try { string serviceAddress = serviceaddress + strcontent; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress); WebHeaderCollection myWebHeaderCollection = request.Headers; request.CookieContainer = cc; if (header != "") { myWebHeaderCollection.Add("access_token:" + header); } request.Method = "GET"; request.ContentType = contenttype; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); //解析josn JObject jo = JObject.Parse(retString); return jo; } catch (Exception) { return null; } } /// /// Post请求 /// /// 请求地址 /// 头 application/x-www-form-urlencoded /// 参数 /// token /// public static JObject PostFunction(string serviceaddress, string contenttype, string strcontent, string header, int Timeout = 5000) { try { string serviceAddress = serviceaddress; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress); WebHeaderCollection myWebHeaderCollection = request.Headers; request.CookieContainer = cc; //myWebHeaderCollection.Add("Accept", "*/*"); if (header != "") { myWebHeaderCollection.Add("access_token:" + header); } request.Timeout = Timeout; request.Method = "POST"; request.ContentType = contenttype; using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream())) { dataStream.Write(strcontent); dataStream.Close(); } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string encoding = response.ContentEncoding; if (encoding == null || encoding.Length < 1) { encoding = "UTF-8"; //默认编码 } StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding)); string retString = reader.ReadToEnd(); retString = retString.Replace("\\r\\n", ""); //解析josn JObject jo = JObject.Parse(retString); return jo; } catch (Exception ex) { LogHelper.WriteErrLog("请求失败(若网络无问题,请重置winsock,解决方法:以管理员方式打开cmd执行 netsh winsock reset 后重启)", ex); return null; } } /// /// 上传方法 /// /// webapi地址 /// 本地文件路径,单文件默认为string[0] /// /// 参数可不传 /// public static JObject UploadFilesToRemoteUrl(string url, string[] files, string token, NameValueCollection formFields = null) { string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "multipart/form-data; boundary=" + boundary; request.Method = "POST"; request.KeepAlive = true; Stream memStream = new System.IO.MemoryStream(); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); byte[] endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--"); WebHeaderCollection myWebHeaderCollection = request.Headers; request.CookieContainer = cc; if (token != "") { myWebHeaderCollection.Add("access_token:" + token); } string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; if (formFields != null) { foreach (string key in formFields.Keys) { string formitem = string.Format(formdataTemplate, key, formFields[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); memStream.Write(formitembytes, 0, formitembytes.Length); } } string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n"; for (int i = 0; i < files.Length; i++) { memStream.Write(boundarybytes, 0, boundarybytes.Length); string header = string.Format(headerTemplate, "fileData", files[i]); byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); memStream.Write(headerbytes, 0, headerbytes.Length); using (FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { memStream.Write(buffer, 0, bytesRead); } } } //memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); request.ContentLength = memStream.Length; using (Stream requestStream = request.GetRequestStream()) { memStream.Position = 0; byte[] tempBuffer = new byte[memStream.Length]; memStream.Read(tempBuffer, 0, tempBuffer.Length); memStream.Close(); requestStream.Write(tempBuffer, 0, tempBuffer.Length); } using (WebResponse response = request.GetResponse()) { Stream stream2 = response.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); JObject a = JObject.Parse(reader2.ReadToEnd()); return a; } } /// /// HttpWebRequest 下载 /// /// URI /// public static bool GetDataGetHtml(string url, string filePath, string header) { try { HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url); //httpWebRequest.ContentType = "application/x-www-form-urlencoded"; httpWebRequest.Method = "GET"; //httpWebRequest.ContentType = "image/jpeg"; //对发送的数据不使用缓存 httpWebRequest.AllowWriteStreamBuffering = false; //httpWebRequest.Timeout = 300000; httpWebRequest.ServicePoint.Expect100Continue = false; WebHeaderCollection myWebHeaderCollection = httpWebRequest.Headers; //myWebHeaderCollection.Add("Accept", "*/*"); if (header != "") { myWebHeaderCollection.Add("access_token:" + header); } HttpWebResponse webRespon = (HttpWebResponse)httpWebRequest.GetResponse(); Stream webStream = webRespon.GetResponseStream(); long length = webRespon.ContentLength; if (webStream == null) { return false; } int lengthint = Convert.ToInt32(length); //int num = lengthint / 1024; //int count = 0; //M_DownloadInfo.totalCount = lengthint / 1024; //M_DownloadInfo.downloadCount = 0; Stream stream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite); byte[] bArr = new byte[1024]; int size = webStream.Read(bArr, 0, bArr.Length); while (size > 0) { stream.Write(bArr, 0, size); size = webStream.Read(bArr, 0, bArr.Length); //M_DownloadInfo.downloadCount = M_DownloadInfo.downloadCount + 1; } webRespon.Close(); stream.Close(); webStream.Close(); return true; } catch (Exception) { //LogHelper.WriteErrLog("请求失败:" + ex.Message, ex); return false; } } /// /// 上传文件流 /// 创建人:赵耀 /// 创建时间:2020年9月5日 /// /// URL /// 文件数据流 /// 文件名 /// 参数 可不传 public static JObject UploadRequestflow(string url, byte[] databyte, string filename, NameValueCollection formFields = null) { JObject jobResult = null; // 时间戳,用做boundary string boundary = "-----" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); //根据uri创建HttpWebRequest对象 HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(url)); httpReq.ContentType = "multipart/form-data; boundary=" + boundary; httpReq.Method = "POST"; httpReq.KeepAlive = true; //httpReq.Timeout = 300000; //httpReq.AllowWriteStreamBuffering = false; //对发送的数据不使用缓存 httpReq.Credentials = CredentialCache.DefaultCredentials; try { Stream postStream = httpReq.GetRequestStream(); //参数 const string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; if (formFields != null) { foreach (string key in formFields.Keys) { postStream.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, formFields[key]); byte[] formitembytes = Encoding.UTF8.GetBytes(formitem); postStream.Write(formitembytes, 0, formitembytes.Length); } } postStream.Write(boundarybytes, 0, boundarybytes.Length); const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; //文件头 string header = string.Format(headerTemplate, "file", filename); byte[] headerbytes = Encoding.UTF8.GetBytes(header); postStream.Write(headerbytes, 0, headerbytes.Length); //文件流 postStream.Write(databyte, 0, databyte.Length); //结束边界 byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); postStream.Write(boundaryBytes, 0, boundaryBytes.Length); postStream.Close(); //获取服务器端的响应 using (HttpWebResponse response = (HttpWebResponse)httpReq.GetResponse()) { Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8); string returnValue = readStream.ReadToEnd(); jobResult = JObject.Parse(returnValue); response.Close(); readStream.Close(); } return jobResult; } catch (Exception ex) { LogHelper.WriteErrLog("【文件上传】" + ex.Message, ex); return null; } finally { httpReq = null; } } /// /// Post Http请求 /// /// /// /// /// /// /// 响应流字符串 public static string PostAndRespStr(string url, string postData = "", int timeout = 5000, string contentType = "application/json;", string encode = "UTF-8") { if (!string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(encode) && !string.IsNullOrEmpty(contentType) && postData != null) { HttpWebResponse webResponse = null; Stream responseStream = null; Stream requestStream = null; StreamReader streamReader = null; try { string postDataAES = postData; bool IsParameterEncryption = FileToolsCommon.GetConfigValue("IsParameterEncryption") != "0"; if (IsParameterEncryption) { postDataAES = AESHelper.AESEncrypt(postData, "XINGHUOLIAOYUAN7"); } return GetStreamReader(url, responseStream, requestStream, streamReader, webResponse, timeout, encode, postDataAES, contentType); } catch (Exception) { } finally { if (responseStream != null) { responseStream.Dispose(); } if (webResponse != null) { webResponse.Close(); } if (requestStream != null) { requestStream.Dispose(); } if (streamReader != null) { streamReader.Dispose(); } } } return null; } /// /// 获取公网IP和地址,失败则获取局域网IP /// /// IP地址 /// 地址 /// public static bool GetAddressIP(out string AddressIP, out string Address) { AddressIP = ""; Address = ""; try { //请求搜狐获取公网IP,获取失败后获取局域网IP WebRequest request = WebRequest.Create("http://pv.sohu.com/cityjson?ie=utf-8"); request.Timeout = 10000; WebResponse response = request.GetResponse(); Stream resStream = response.GetResponseStream(); StreamReader sr = new StreamReader(resStream, System.Text.Encoding.UTF8); string htmlinfo = sr.ReadToEnd(); string jsonStr = htmlinfo.Substring(htmlinfo.IndexOf("{"), htmlinfo.LastIndexOf("}") - htmlinfo.IndexOf("{") + 1); JObject obj = JObject.Parse(jsonStr); AddressIP = obj["cip"].ToString(); Address = obj["cname"].ToString(); resStream.Close(); sr.Close(); return true; //Regex r = new Regex("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\\.){3}(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|[1-9])", RegexOptions.None); //Match mc = r.Match(htmlinfo); //AddressIP = mc.Groups[0].Value; } catch (Exception) { //获取本地局域网IP foreach (System.Net.IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } return false; } } } }