using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Web; using System.Windows.Forms; namespace CadCoreApp { public static class HttpHelper { /// <summary> /// http/https請求響應 /// </summary> /// <param name="getOrPost"></param> /// <param name="url">地址(要帶上http或https)</param> /// <param name="headers">請求頭</param> /// <param name="parameters">提交數據</param> /// <param name="dataEncoding">編碼類型 utf-8</param> /// <param name="contentType">application/x-www-form-urlencoded</param> /// <returns></returns> public static HttpWebResponse HttpRequest( string getOrPost, string url, Dictionary<string, string> headers, Dictionary<string, string> parameters, Encoding dataEncoding, string contentType ) { var request = CreateRequest(getOrPost, url, headers, parameters, dataEncoding, contentType); //如果需要POST數據 if (getOrPost == "POST" && !(parameters == null || parameters.Count == 0)) { var data = FormatPostParameters(parameters, dataEncoding, contentType); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); stream.Close(); } } WebResponse Res = null; try { Res = request.GetResponse(); } catch (WebException ex) { Res = (HttpWebResponse)ex.Response; } catch (Exception e) { throw e; } if (null == Res) { return request.GetResponse() as HttpWebResponse; } return (HttpWebResponse)Res; } /// <summary> /// 創建HTTP請求對象 /// </summary> /// <param name="getOrPost"></param> /// <param name="url"></param> /// <param name="headers"></param> /// <param name="parameters"></param> /// <param name="paraEncoding"></param> /// <param name="contentType"></param> /// <returns></returns> private static HttpWebRequest CreateRequest( string getOrPost , string url , Dictionary<string, string> headers , Dictionary<string, string> parameters , Encoding paraEncoding , string contentType ) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (parameters != null && parameters.Count > 0 && paraEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //判斷是否是https 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; } if (getOrPost == "GET") { request.Method = "GET"; if (parameters != null && parameters.Count > 0) { url = FormatGetParametersToUrl(url, parameters, paraEncoding); } } else { request.Method = "POST"; } if (contentType == null) { request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; } else { request.ContentType = contentType; } //POST的數據大於1024字節的時候,如果不設置會分兩步 request.ServicePoint.Expect100Continue = false; request.ServicePoint.ConnectionLimit = int.MaxValue; if (headers != null) { FormatRequestHeaders(headers, request); } return request; } /// <summary> /// 格式化請求頭信息 /// </summary> /// <param name="headers"></param> /// <param name="request"></param> private static void FormatRequestHeaders(Dictionary<string, string> headers, HttpWebRequest request) { foreach (var hd in headers) { //因為HttpWebRequest中很多標准標頭都被封裝成只能通過屬性設置,添加的話會拋出異常 switch (hd.Key.ToLower()) { case "connection": request.KeepAlive = false; break; case "content-type": request.ContentType = hd.Value; break; case "transfer-enconding": request.TransferEncoding = hd.Value; break; default: request.Headers.Add(hd.Key, hd.Value); break; } } } /// <summary> /// 格式化Get請求參數 /// </summary> /// <param name="url">URL</param> /// <param name="parameters">參數</param> /// <param name="paraEncoding">編碼格式</param> /// <returns></returns> private static string FormatGetParametersToUrl(string url, Dictionary<string, string> parameters, Encoding paraEncoding) { if (url.IndexOf("?") < 0) url += "?"; int i = 0; string sendContext = ""; foreach (var parameter in parameters) { if (i > 0) { sendContext += "&"; } sendContext += HttpUtility.UrlEncode(parameter.Key, paraEncoding) + "=" + HttpUtility.UrlEncode(parameter.Value, paraEncoding); ++i; } url += sendContext; return url; } /// <summary> /// 格式化Post請求參數 /// </summary> /// <param name="parameters">編碼格式</param> /// <param name="dataEncoding">編碼格式</param> /// <param name="contentType">類型</param> /// <returns></returns> private static byte[] FormatPostParameters(Dictionary<string, string> parameters, Encoding dataEncoding, string contentType) { string sendContext = ""; int i = 0; if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { sendContext = "{"; } foreach (var para in parameters) { if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { if (i > 0) { if (para.Value.StartsWith("{")) { sendContext += string.Format(@",""{0}"":{1}", para.Key, para.Value); } else { sendContext += string.Format(@",""{0}"":""{1}""", para.Key, para.Value); } } else { if (para.Value.StartsWith("{")) { sendContext += string.Format(@"""{0}"":{1}", para.Key, para.Value); } else { sendContext += string.Format(@"""{0}"":""{1}""", para.Key, para.Value); } } } else { if (i > 0) { sendContext += string.Format("&{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding)); } else { sendContext = string.Format("{0}={1}", para.Key, HttpUtility.UrlEncode(para.Value, dataEncoding)); } } i++; } if (!string.IsNullOrEmpty(contentType) && contentType.ToLower().Trim() == "application/json") { sendContext += "}"; } byte[] data = dataEncoding.GetBytes(sendContext); return data; } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //總是接受 } /// <summary> /// 正常GET /// </summary> /// <param name="Url"></param> /// <returns></returns> //contentType application/json or application/xml public static string HttpGet(string Url) { try { string contentType = "application/json; charset=UTF-8"; string retString = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "GET"; request.ContentType = contentType; request.Accept = contentType; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(myResponseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); myResponseStream.Close(); return retString; } catch (Exception ex) { throw ex; } } /// <summary> /// 正常通用請求 /// </summary> /// <param name="Url"></param> /// <param name="postDataStr"></param> /// <returns></returns> public static string HttpPost(string Url, string postDataStr) { string retString = string.Empty; string contentType = "application/json; charset=UTF-8"; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url); request.Method = "POST"; request.ContentType = contentType; request.Accept = contentType; request.Timeout = 600000;//設置超時時間 request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken)); Stream requestStream = request.GetRequestStream(); StreamWriter streamWriter = new StreamWriter(requestStream); streamWriter.Write(postDataStr); streamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); } catch (Exception ex) { if (ex.GetType() == typeof(WebException))//捕獲400錯誤 { var response = ((WebException)ex).Response; Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); } else { retString = ex.ToString(); } } return retString; } /// <summary> /// 驗證GET請求 /// </summary> /// <param name="url"></param> /// <param name="postVars"></param> /// <returns></returns> public static string ALHttpGet(string url ,string postVars) { try { string contentType = "application/json; charset=UTF-8"; string retString = string.Empty; url = String.Format(url + "?{0}", postVars); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = contentType; request.Accept = contentType; request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken)); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(myResponseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); myResponseStream.Close(); return retString; } catch (Exception ex) { throw ex; } } /// <summary> /// 驗證通用請求 /// </summary> /// <param name="url"></param> /// <param name="verb">POST PUT</param> /// <param name="postDataStr"></param> /// <returns></returns> public static string ALHttpRequest(string url,string verb, string postDataStr) { string retString = string.Empty; string contentType = "application/json; charset=UTF-8"; try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = verb; request.ContentType = contentType; request.Accept = contentType; request.Timeout = 600000;//設置超時時間 request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); request.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken)); Stream requestStream = request.GetRequestStream(); StreamWriter streamWriter = new StreamWriter(requestStream); streamWriter.Write(postDataStr); streamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); } catch (Exception ex) { if (ex.GetType() == typeof(WebException))//捕獲400錯誤 { var response = ((WebException)ex).Response; Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); } else { retString = ex.ToString(); } } return retString; } /// </summary> /// 帶驗證將本地文件上傳到指定的服務器(HttpWebRequest方法) /// </summary> /// <param name="address">文件上傳到的服務器</param> /// <param name="fileNamePath">要上傳的本地文件(全路徑)</param> /// <param name="saveName">文件上傳后的名稱</param> /// <returns>成功返回1,失敗返回0</returns> private static int ALUpload_Request(string url, string fileNamePath, string saveName) { int returnValue = 0; // 要上傳的文件 FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read); BinaryReader r = new BinaryReader(fs); //時間戳 string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x"); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //請求頭部信息 StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\""); sb.Append("file"); sb.Append("\"; filename=\""); sb.Append(saveName); sb.Append("\""); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("application/octet-stream"); sb.Append("\r\n"); sb.Append("\r\n"); string strPostHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // 根據uri創建HttpWebRequest對象 HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(url)); httpReq.Method = "POST"; httpReq.Headers.Add(String.Format("Authorization: Bearer {0}", Common.AccessToken)); //對發送的數據不使用緩存 httpReq.AllowWriteStreamBuffering = false; //設置獲得響應的超時時間(300秒) httpReq.Timeout = 300000; httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary; long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length; long fileLength = fs.Length; httpReq.ContentLength = length; try { //每次上傳4k int bufferLength = 4096; byte[] buffer = new byte[bufferLength]; //已上傳的字節數 long offset = 0; //開始上傳時間 DateTime startTime = DateTime.Now; int size = r.Read(buffer, 0, bufferLength); Stream postStream = httpReq.GetRequestStream(); //發送請求頭部消息 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); while (size > 0) { postStream.Write(buffer, 0, size); offset += size; TimeSpan span = DateTime.Now - startTime; double second = span.TotalSeconds; Application.DoEvents(); size = r.Read(buffer, 0, bufferLength); } //添加尾部的時間戳 postStream.Write(boundaryBytes, 0, boundaryBytes.Length); postStream.Close(); //獲取服務器端的響應 WebResponse webRespon = httpReq.GetResponse(); Stream s = webRespon.GetResponseStream(); StreamReader sr = new StreamReader(s); //讀取服務器端返回的消息 String sReturnString = sr.ReadLine(); s.Close(); sr.Close(); if (sReturnString == "Success") { returnValue = 1; } else if (sReturnString == "Error") { returnValue = 0; } } catch (Exception ex) { returnValue = 0; } finally { fs.Close(); r.Close(); } return returnValue; } } }
