using DS.Module.Core.Extensions; using DS.Module.Core.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using static System.Net.Mime.MediaTypeNames; namespace DS.Module.PrintModule { /// /// 打印服务封装请求工具类 /// public class HttpUtillib { /// /// 平台ip /// private static string _ip; /// /// 平台端口 /// private static int _port = 443; /// /// 平台APPKey /// private static string _appkey; /// /// 平台APPSecret /// private static string _secret; /// /// 是否使用HTTPS协议 /// private static bool _isHttps = true; /// /// 设置信息参数 /// /// 合作方APPKey /// 合作方APPSecret /// 平台IP /// 平台端口,默认HTTPS的443端口 /// 是否启用HTTPS协议,默认HTTPS /// public static void SetPlatformInfo(string appkey, string secret, string ip, int port = 443, bool isHttps = true) { _appkey = appkey; _secret = secret; _ip = ip; _port = port; _isHttps = isHttps; // 设置并发数,如不设置默认为2 ServicePointManager.DefaultConnectionLimit = 512; } /// /// HTTP GET请求 /// /// HTTP接口Url,不带协议和端口,如/artemis/api/resource/v1/cameras/indexCode?cameraIndexCode=a10cafaa777c49a5af92c165c95970e0 /// 请求超时时间,单位:秒 /// public static string HttpGet(string uri, int timeout) { Dictionary header = new Dictionary(); // 初始化请求:组装请求头,设置远程证书自动验证通过 initRequest(header, uri, "", false); // build web request object StringBuilder sb = new StringBuilder(); sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString()); req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version11; req.AllowAutoRedirect = false; // 不允许自动重定向 req.Method = "GET"; req.Timeout = timeout * 1000; // 传入是秒,需要转换成毫秒 req.Accept = header["Accept"]; req.ContentType = header["Content-Type"]; foreach (string headerKey in header.Keys) { if (headerKey.Contains("appId")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("timestamp")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("sign")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } } HttpWebResponse rsp = null; try { rsp = (HttpWebResponse)req.GetResponse(); if (HttpStatusCode.OK == rsp.StatusCode) { Stream rspStream = rsp.GetResponseStream(); // 响应内容字节流 StreamReader sr = new StreamReader(rspStream); string strStream = sr.ReadToEnd(); long streamLength = strStream.Length; byte[] response = System.Text.Encoding.UTF8.GetBytes(strStream); rsp.Close(); return System.Text.Encoding.UTF8.GetString(response); } else if (HttpStatusCode.Found == rsp.StatusCode || HttpStatusCode.Moved == rsp.StatusCode) // 302/301 redirect { string reqUrl = rsp.Headers["Location"].ToString(); // 获取重定向URL WebRequest wreq = WebRequest.Create(reqUrl); // 重定向请求对象 WebResponse wrsp = wreq.GetResponse(); // 重定向响应 long streamLength = wrsp.ContentLength; // 重定向响应内容长度 Stream rspStream = wrsp.GetResponseStream(); // 响应内容字节流 byte[] response = new byte[streamLength]; rspStream.Read(response, 0, (int)streamLength); // 读取响应内容至byte数组 rspStream.Close(); rsp.Close(); return System.Text.Encoding.UTF8.GetString(response); } rsp.Close(); } catch (WebException e) { if (rsp != null) { rsp.Close(); } } return null; } /// /// HTTP GET请求 /// /// HTTP接口Url,不带协议和端口,如/artemis/api/resource/v1/cameras/indexCode?cameraIndexCode=a10cafaa777c49a5af92c165c95970e0 /// 请求超时时间,单位:秒 /// public static async Task HttpGetAsync(string uri, int timeout) { Dictionary header = new Dictionary(); // 初始化请求:组装请求头,设置远程证书自动验证通过 initRequest(header, uri, "", false); // build web request object StringBuilder sb = new StringBuilder(); sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString()); req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version11; req.AllowAutoRedirect = false; // 不允许自动重定向 req.Method = "GET"; req.Timeout = timeout * 1000; // 传入是秒,需要转换成毫秒 req.Accept = header["Accept"]; req.ContentType = header["Content-Type"]; foreach (string headerKey in header.Keys) { if (headerKey.Contains("appId")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("timestamp")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("sign")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } } HttpWebResponse rsp = null; try { //rsp = (HttpWebResponse)req.GetResponse(); var rsp1 = await req.GetResponseAsync(); rsp = (HttpWebResponse)rsp1; if (HttpStatusCode.OK == rsp.StatusCode) { Stream rspStream = rsp.GetResponseStream(); // 响应内容字节流 StreamReader sr = new StreamReader(rspStream); string strStream = sr.ReadToEnd(); long streamLength = strStream.Length; byte[] response = System.Text.Encoding.UTF8.GetBytes(strStream); rsp.Close(); return System.Text.Encoding.UTF8.GetString(response); } else if (HttpStatusCode.Found == rsp.StatusCode || HttpStatusCode.Moved == rsp.StatusCode) // 302/301 redirect { string reqUrl = rsp.Headers["Location"].ToString(); // 获取重定向URL WebRequest wreq = WebRequest.Create(reqUrl); // 重定向请求对象 WebResponse wrsp = await wreq.GetResponseAsync(); // 重定向响应 long streamLength = wrsp.ContentLength; // 重定向响应内容长度 Stream rspStream = wrsp.GetResponseStream(); // 响应内容字节流 byte[] response = new byte[streamLength]; rspStream.Read(response, 0, (int)streamLength); // 读取响应内容至byte数组 rspStream.Close(); rsp.Close(); return System.Text.Encoding.UTF8.GetString(response); } rsp.Close(); } catch (WebException e) { if (rsp != null) { rsp.Close(); } } return null; } /// /// HTTP Post请求 /// /// HTTP接口Url,不带协议和端口,如/artemis/api/resource/v1/org/advance/orgList /// 请求参数 /// 请求超时时间,单位:秒 /// 请求结果 public static string HttpPost(string uri, string body, int timeout) { Dictionary header = new Dictionary(); // 初始化请求:组装请求头,设置远程证书自动验证通过 initRequest(header, uri, body, true); // build web request object StringBuilder sb = new StringBuilder(); sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri); // 创建POST请求 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString()); req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version11; req.AllowAutoRedirect = false; // 不允许自动重定向 req.Method = "POST"; req.Timeout = timeout * 1000; // 传入是秒,需要转换成毫秒 req.Accept = header["Accept"]; req.ContentType = header["Content-Type"]; req.UserAgent = "PostmanRuntime/7.26.8"; foreach (string headerKey in header.Keys) { if (headerKey.Contains("appId")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("timestamp")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("sign")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } } byte[] data = Encoding.UTF8.GetBytes(body); req.ContentLength = data.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(data, 0, data.Length); reqStream.Close(); } HttpWebResponse response = (HttpWebResponse)req.GetResponse(); Stream stream = response.GetResponseStream(); Encoding encode = Encoding.UTF8; StreamReader reader = new StreamReader(stream, encode); string content = reader.ReadToEnd(); stream.Close(); reader.Close(); return content; } /// /// HTTP Post请求 /// /// HTTP接口Url,不带协议和端口,如/artemis/api/resource/v1/org/advance/orgList /// 请求参数 /// 请求超时时间,单位:秒 /// 请求结果 public static async Task HttpPostAsync(string uri, string body, int timeout) { Dictionary header = new Dictionary(); // 初始化请求:组装请求头,设置远程证书自动验证通过 initRequest(header, uri, body, true); // build web request object StringBuilder sb = new StringBuilder(); sb.Append(_isHttps ? "https://" : "http://").Append(_ip).Append(":").Append(_port.ToString()).Append(uri); // 创建POST请求 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sb.ToString()); req.KeepAlive = false; req.ProtocolVersion = HttpVersion.Version11; req.AllowAutoRedirect = false; // 不允许自动重定向 req.Method = "POST"; req.Timeout = timeout * 1000; // 传入是秒,需要转换成毫秒 req.Accept = header["Accept"]; req.ContentType = header["Content-Type"]; req.UserAgent = "PostmanRuntime/7.26.8"; foreach (string headerKey in header.Keys) { if (headerKey.Contains("appId")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("timestamp")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } if (headerKey.Contains("sign")) { req.Headers.Add(headerKey + ":" + header[headerKey]); } } byte[] data = Encoding.UTF8.GetBytes(body); req.ContentLength = data.Length; using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(data, 0, data.Length); reqStream.Close(); } var rsp1 = await req.GetResponseAsync(); HttpWebResponse response = (HttpWebResponse)rsp1; //HttpWebResponse response = (HttpWebResponse)req.GetResponseAsync(); Stream stream = response.GetResponseStream(); Encoding encode = Encoding.UTF8; StreamReader reader = new StreamReader(stream, encode); string content = reader.ReadToEnd(); stream.Close(); reader.Close(); return content; } /// /// 远程证书验证 /// /// /// /// /// /// 验证是否通过,始终通过 private static bool remoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { return true; } private static void initRequest(Dictionary header, string url, string body, bool isPost) { // Accept // string accept = "application/json"; // "*/*"; string accept = "*/*"; // "*/*"; header.Add("Accept", accept); // ContentType string contentType = "application/json"; header.Add("Content-Type", contentType); // appId header.Add("appId", _appkey); var timestamp = DateTime.Now.DateToTimeStamp(); // build string to sign string signedStr = MD5Helper.Md5EncryptLowerCase(timestamp + _secret); // timestamp header.Add("timestamp", DateTime.Now.DateToTimeStamp()); // sign header.Add("sign", signedStr); if (_isHttps) { // set remote certificate Validation auto pass ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(remoteCertificateValidate); // FIX:修复不同.Net版对一些SecurityProtocolType枚举支持情况不一致导致编译失败等问题,这里统一使用数值 // ServicePointManager.SecurityProtocol = (SecurityProtocolType)48 | (SecurityProtocolType)3072 | // (SecurityProtocolType)768 | (SecurityProtocolType)192 ; // ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; } } } }