namespace Common.system { using Newtonsoft.Json.Linq; using System; 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; public class ZHttpUtil { public static string tokenKey = ""; public static string tokenValue = ""; public static string userId = ""; public static string version = ""; public static bool isSt; public static void InitRequest(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; if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult; request = WebRequest.Create(url) as HttpWebRequest; if (request != null) { 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 = GetHttpWebRequest(downloadUrl); InitRequest(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 GetStr(string url) { try { HttpWebRequest request = GetHttpWebRequest(url); if (request != null) { AddHeader(request); string retval; InitRequest(ref request); using (WebResponse response = request.GetResponse()) { // ReSharper disable once AssignNullToNotNullAttribute using (StreamReader reader = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8)) { retval = reader.ReadToEnd(); } } return retval; } } catch (Exception) { // ignored } return null; } private static void AddHeader(HttpWebRequest webRequest) { webRequest.Headers.Add("Xh-St", isSt ? "true" : "false"); if (!string.IsNullOrEmpty(tokenKey) && !string.IsNullOrEmpty(tokenValue)) { webRequest.Headers.Add("Xh-Token-Key", tokenKey); webRequest.Headers.Add("Xh-Token-Value", tokenValue); } if (!string.IsNullOrEmpty(userId)) { webRequest.Headers.Add("Xh-User-Id", userId); } webRequest.Headers.Add("Xh-Device", "microlecture_pc_t"); webRequest.Headers.Add("Xh-Version", version); } /// /// 调用Post接口 /// /// public static string PostStr(string url, string postData, bool jm = true) { Stream responseStream = null; try { Encoding encoding = Encoding.UTF8; HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = "POST"; webRequest.Accept = "text/html,application/xhtml+xml,*/*"; webRequest.ContentType = "application/json"; string aesPostData = postData; if (jm) { if (isSt) { aesPostData = AesHelper.AesEncrypt(postData, "XINGHUOLIAOYUAN7"); } AddHeader(webRequest); } byte[] buffer = encoding.GetBytes(aesPostData); webRequest.ContentLength = buffer.Length; webRequest.GetRequestStream() .Write ( buffer, 0, buffer.Length ); HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); isSt = webResponse.GetResponseHeader("Xh-St") == "true"; responseStream = webResponse.GetResponseStream(); if (responseStream == null) { return ""; } using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8)) { return reader.ReadToEnd(); } } catch (Exception) { return ""; } finally { if (responseStream != null) { responseStream.Dispose(); } } } /// /// Post Http请求 /// /// 请求地址 /// 传输数据 /// 加密 /// 超时时间 /// 媒体格式 /// 编码 /// 泛型集合 public static T PostSignle ( string url, string postData = "", bool jm = true, int timeout = 5000, string contentType = "application/json;", string encode = "UTF-8" ) where T : class { if (!string.IsNullOrEmpty(url) && !string.IsNullOrEmpty(encode) && !string.IsNullOrEmpty(contentType) && postData != null) { try { string respstr = PostStr(url, postData, jm); return JsonHelper.JsonToObj(respstr); } catch (Exception) { // ignored } } return default; } /// /// Cookie /// public static CookieContainer cc = new CookieContainer(); /// /// 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.Length < 1) { encoding = "UTF-8"; //默认编码 } // ReSharper disable once AssignNullToNotNullAttribute 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.Logerror.Error("请求失败(若网络无问题,请重置winsock,解决方法:以管理员方式打开cmd执行 netsh winsock reset 后重启)", ex); return null; } } /// /// 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(); if (webStream == null) { return false; } 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) { return false; } } /// /// 上传文件流 /// 创建人:赵耀 /// 创建时间:2020年9月5日 /// /// URL /// 文件数据流 /// 文件名 /// 参数 可不传 public static JObject UploadRequestflow(string url, byte[] databyte, string filename, NameValueCollection formFields = 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(); //获取服务器端的响应 JObject jobResult = null; using (HttpWebResponse response = (HttpWebResponse)httpReq.GetResponse()) { Stream receiveStream = response.GetResponseStream(); if (receiveStream != null) { 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.Logerror.Error("【文件上传】" + ex.Message, ex); 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(); if (resStream != null) { StreamReader sr = new StreamReader(resStream, System.Text.Encoding.UTF8); string htmlinfo = sr.ReadToEnd(); string jsonStr = htmlinfo.Substring(htmlinfo.IndexOf("{", StringComparison.Ordinal), htmlinfo.LastIndexOf("}", StringComparison.Ordinal) - htmlinfo.IndexOf("{", StringComparison.Ordinal) + 1); JObject obj = JObject.Parse(jsonStr); addressIp = obj["cip"]?.ToString(); address = obj["cname"]?.ToString(); resStream.Close(); sr.Close(); } return true; } catch (Exception) { //获取本地局域网IP foreach (System.Net.IPAddress ipAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (ipAddress.AddressFamily.ToString() == "InterNetwork") { addressIp = ipAddress.ToString(); } } return false; } } } }