首先列出HttpHelper類 /// <summary> /// Http操作類 /// </summary> public class HttpHelper { private static log4net.ILog mLog = log4net.LogManager.GetLogger("Ht ...
首先列出HttpHelper類
/// <summary> /// Http操作類 /// </summary> public class HttpHelper { private static log4net.ILog mLog = log4net.LogManager.GetLogger("HttpHelper"); [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InternetSetCookie(string lpszUrlName, string lbszCookieName, string lpszCookieData); [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool InternetGetCookie(string lpszUrlName, string lbszCookieName, StringBuilder lpszCookieData, ref int lpdwSize); public static StreamReader mLastResponseStream = null; public static System.IO.StreamReader LastResponseStream { get { return mLastResponseStream; } } private static CookieContainer mCookie = null; public static CookieContainer Cookie { get { return mCookie; } set { mCookie = value; } } private static CookieContainer mLastCookie = null; public static HttpWebRequest CreateWebRequest(string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, int timeout, bool keepAlive) { if (String.IsNullOrWhiteSpace(url)) { throw new Exception("URL為空"); } HttpWebRequest webRequest = null; Stream requestStream = null; byte[] datas = null; switch (httpType) { case HttpRequestType.GET: case HttpRequestType.DELETE: if (!String.IsNullOrWhiteSpace(data)) { if (!url.Contains('?')) { url += "?" + data; } else url += "&" + data; } if(url.StartsWith("https:")) { System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); } webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = Enum.GetName(typeof(HttpRequestType), httpType); if (contentType != null) { webRequest.ContentType = contentType; } if (mCookie == null) { webRequest.CookieContainer = new CookieContainer(); } else { webRequest.CookieContainer = mCookie; } if (keepAlive) { webRequest.KeepAlive = keepAlive; webRequest.ReadWriteTimeout = timeout; webRequest.Timeout = 60000; mLog.Info("請求超時時間..." + timeout); } break; default: if (url.StartsWith("https:")) { System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult); } webRequest = (HttpWebRequest)WebRequest.Create(url); webRequest.Method = Enum.GetName(typeof(HttpRequestType), httpType); if (contentType != null) { webRequest.ContentType = contentType; } if (mCookie == null) { webRequest.CookieContainer = new CookieContainer(); } else { webRequest.CookieContainer = mCookie; } if (keepAlive) { webRequest.KeepAlive = keepAlive; webRequest.ReadWriteTimeout = timeout; webRequest.Timeout = 60000; mLog.Info("請求超時時間..." + timeout); } if (!String.IsNullOrWhiteSpace(data)) { datas = requestEncoding.GetBytes(data); } if (datas != null) { webRequest.ContentLength = datas.Length; requestStream = webRequest.GetRequestStream(); requestStream.Write(datas, 0, datas.Length); requestStream.Flush(); requestStream.Close(); } break; } //mLog.InfoFormat("請求 Url:{0},HttpRequestType:{1},contentType:{2},data:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType, data); return webRequest; } public static CookieContainer GetLastCookie() { return mLastCookie; } /// <summary> /// 設置HTTP的Cookie,以後發送和請求用此Cookie /// </summary> /// <param name="cookie">CookieContainer</param> public static void SetHttpCookie(CookieContainer cookie) { mCookie = cookie; } private static HttpWebRequest mLastAsyncRequest = null; public static HttpWebRequest LastAsyncRequest { get { return mLastAsyncRequest; } set { mLastAsyncRequest = value; } } /// <summary> /// 發送請求 /// </summary> /// <param name="url">請求Url</param> /// <param name="httpType">請求類型</param> /// <param name="contentType">contentType:application/x-www-form-urlencoded</param> /// <param name="data">請求數據</param> /// <param name="encoding">請求數據傳輸時編碼格式</param> /// <returns>返回請求結果</returns> public static string SendRequest(string url, HttpRequestType httpType, string contentType, string data, Encoding requestEncoding, Encoding reponseEncoding, params AsyncCallback[] callBack) { int timeout = 0; bool keepAlive = false; if (callBack != null && callBack.Length > 0 && callBack[0] != null) { keepAlive = true; timeout = 1000*60*60; mLog.Info("寫入讀取超時時間..." + timeout); } // mLog.Info("開始創建請求...."); HttpWebRequest webRequest = CreateWebRequest(url, httpType, contentType, data, requestEncoding,timeout,keepAlive); string ret = null; // mLog.Info("創建請求結束...."); if (callBack != null && callBack.Length > 0 && callBack[0] != null) { // mLog.Info("開始非同步請求...."); mLastAsyncRequest = webRequest; webRequest.BeginGetResponse(callBack[0], webRequest); } else { // mLog.Info("開始同步請求...."); StreamReader sr = new StreamReader(webRequest.GetResponse().GetResponseStream(), reponseEncoding); ret = sr.ReadToEnd(); sr.Close(); } mLastCookie = webRequest.CookieContainer; //mLog.InfoFormat("結束請求 Url:{0},HttpRequestType:{1},contentType:{2},結果:{3}", url, Enum.GetName(typeof(HttpRequestType), httpType), contentType,ret); return ret; } /// <summary> /// Http上傳文件 /// </summary> public static string HttpUploadFile(string url, string path) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { // 設置參數 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.AllowWriteStreamBuffering = false; request.SendChunked = true; request.Method = "POST"; request.Timeout = 300000; string boundary = DateTime.Now.Ticks.ToString("X"); // 隨機分隔線 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary; byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); int pos = path.LastIndexOf("\\"); string fileName = path.Substring(pos + 1); //請求頭部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName)); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length; using (Stream postStream = request.GetRequestStream()) { postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length); postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); int bytesRead = 0; int arrayLeng = fs.Length <= 4096 ? (int)fs.Length : 4096; byte[] bArr = new byte[arrayLeng]; int counter = 0; while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0) { counter++; postStream.Write(bArr, 0, bytesRead); } postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); } //發送請求並獲取相應回應數據 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { //直到request.GetResponse()程式才開始向目標網頁發送Post請求 using (Stream instream = response.GetResponseStream()) { StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); return content; } } } } public static string HttpUploadFile(string url, MemoryStream files, string fileName) { using (MemoryStream fs = files) { // 設置參數 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; request.AllowAutoRedirect = true; request.AllowWriteStreamBuffering = false; request.SendChunked = true; request.Method = "POST"; request.Timeout = 300000; string boundary = DateTime.Now.Ticks.ToString("X"); // 隨機分隔線 request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary; byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); //請求頭部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName)); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString()); request.ContentLength = itemBoundaryBytes.Length + postHeaderBytes.Length + fs.Length + endBoundaryBytes.Length; using (Stream postStream = request.GetRequestStream()) { postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length); postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); int bytesRead = 0; int arrayLeng = fs.Length <= 4096 ? (int)fs.Length : 4096; byte[] bArr = new byte[arrayLeng]; int counter = 0; fs.Position = 0; while ((bytesRead = fs.Read(bArr, 0, arrayLeng)) != 0) { counter++; postStream.Write(bArr, 0, bytesRead); } postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); } //發送請求並獲取相應回應數據 using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { //直到request.GetResponse()程式才開始向目標網頁發送Post請求 using (Stream instream = response.GetResponseStream()) { StreamReader sr = new StreamReader(instream, Encoding.UTF8); //返回結果網頁(html)代碼 string content = sr.ReadToEnd(); return content; } } } } #region public static 方法 /// <summary> /// 將請求的流轉化為字元串 /// </summary> /// <param name="info"></param> /// <returns></returns> public static string GetStr(Stream info) { string result = ""; try { using (StreamReader sr = new StreamReader(info, System.Text.Encoding.UTF8)) { result = sr.ReadToEnd(); sr.Close(); } } catch { } return result; } /// <summary> /// 參數轉碼 /// </summary> /// <param name="str"></param> /// <returns></returns> public static string stringDecode(string str) { return HttpUtility.UrlDecode(HttpUtility.UrlDecode(str, System.Text.Encoding.GetEncoding("UTF-8")), System.Text.Encoding.GetEncoding("UTF-8")); } /// <summary> /// json反序列化 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="json"></param> /// <returns></returns> public static T Deserialize<T>(string json) { try { T obj = Activator.CreateInstance<T>(); using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(json))) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType()); return (T)serializer.ReadObject(ms); } } catch { return default(T); } } #endregion public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { // 總是接受 return true; } } public enum HttpRequestType { POST, GET, DELETE, PUT, PATCH, HEAD, TRACE, OPTIONS }View Code
然後列出HttpHelper的調用
1、不帶參數調用
public bool ConnectServer() { try { string url = "https://i.cnblogs.com"; string xml = HttpHelper.SendRequest(url, HttpRequestType.POST, null, null, Encoding.UTF8, Encoding.UTF8); NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml); if (nr.Code == "0") { HttpHelper.SetHttpCookie(HttpHelper.GetLastCookie()); mIsConnect = true; return true; } else { mIsConnect = false; return false; } } catch (System.Exception ex) { mIsConnect = false; return false; } }View Code
2.帶參數調用
private bool HandleIntelligentTask(string taskId,bool bStop) { try { if (!mIsConnect) { return false; } StringBuilder sb = new StringBuilder(); sb.AppendFormat("<request>\r\n"); sb.AppendFormat("<task_id>{0}</task_id>\r\n", taskId);//<!-- task-id為調用方生成的UUID或其它串 --> sb.AppendFormat("<status>{0}</status>\r\n",bStop?0:1); sb.AppendFormat("</request>\r\n"); string xml = sb.ToString(); string url = mIAServerUrl + "/sdk_service/rest/video-analysis/handle-intelligent-analysis"; string xml2 = HttpHelper.SendRequest(url, HttpRequestType.POST, "text/plain;charset=utf-8", xml, Encoding.UTF8, Encoding.UTF8); NormalResponse nr = HuaweiXMLHelper.GetNormalResponse(xml2); if (nr.Code == "0") { return true; } else { return false; } } catch (System.Exception ex) { return false; } }View Code
3.非同步調用
private void ReStartAlarmServer(List<string> list, string alarmUrl, Thread[] listThread) { StopAlarm(alarmUrl, listThread); listThread[0]= new Thread(new ThreadStart(delegate() { try { if (!mIsConnect) { mLog.Error("未登錄!--ReStartAlarmServer-結束!"); return; } mLog.Info("ReStartAlarmServer開始報警連接...."); if (String.IsNullOrWhiteSpace(alarmUrl)) return; mLog.InfoFormat("ReStartAlarmServer請求報警:URL={0}", alarmUrl); string xml = "task-id=0"; string xml2 = HttpHelper.SendRequest(alarmUrl, HttpRequestType.POST, "application/x-www-form-urlencoded", xml, Encoding.UTF8, Encoding.UTF8, AlarmCallBack); mLog.Info("ReStartAlarmServer報警連接成功!"); } catch (System.Threading.ThreadAbortException ex) { mLog.Info("ReStartAlarmServer線程已人為終止!" + ex.Message, ex); } catch (System.Exception ex) { mLog.Error("ReStartAlarmServer開始報警連接失敗:" + ex.Message, ex); mLog.Info("ReStartAlarmServer開始重新報警連接...."); mTimes = 50; } finally { } })); listThread[0].IsBackground = true; listThread[0].Start(); } private void AlarmCallBack(IAsyncResult ir) { try { HttpWebRequest webRequest = (HttpWebRequest)ir.AsyncState; string salarmUrl = webRequest.Address.OriginalString; Thread[] alarmThead = dicAlarmUrls[salarmUrl]; HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(ir); Stream stream = response.GetResponseStream(); alarmThead[1]= new Thread(new ThreadStart(delegate() { try { byte[] buffer = new byte[mAlarmReadCount]; int count = 0; string strMsg = ""; int startIndex = -1; int endIndex = -1; NormalResponse res = null; DateTime dtStart = DateTime.Now; DateTime dtEnd = DateTime.Now; while (!mIsCloseAlarm) { count = stream.Read(buffer, 0, mAlarmReadCount); if (count > 0) { strMsg += Encoding.UTF8.GetString(buffer, 0, count); startIndex = strMsg.IndexOf("<response>"); endIndex = strMsg.IndexOf("</response>"); string xml = strMsg.Substring(startIndex, endIndex - startIndex + "</response>".Length); res = HuaweiXMLHelper.GetNormalResponse(xml); strMsg = strMsg.Substring(endIndex + "</response>".Length); startIndex = -1; endIndex = -1; break; } dtEnd = DateTime.Now; if ((dtEnd - dtStart).TotalSeconds > 10) { throw new Exception("連接信息未有獲取到,需要重啟報警!"); } } while (!mIsCloseAlarm) { count = stream.Read(buffer, 0, mAlarmReadCount); if (count > 0) { string temp = Encoding.UTF8.GetString(buffer, 0, count); strMsg += temp; while (strMsg.Length > 0) { if (startIndex == -1)//未發現第一個<task-info> { startIndex = strMsg.IndexOf("<task-info>"); if (startIndex == -1) { if (strMsg.Length >= "<task-info>".Length) { strMsg = strMsg.Substring(strMsg.Length - "<task-info>".Length); } break; } } if (startIndex >= 0) { int i = startIndex + "<task-info>".Length; int taskInfoEndIndex = strMsg.IndexOf("</task-info>", i); if (taskInfoEndIndex > 0)//必須有任務結束節點 { i = taskInfoEndIndex + "</task-info>".Length; int i1 = strMsg.IndexOf("</attach-rules>", i);//找到軌跡節點結束 int i2 = strMsg.IndexOf("</alarm>", i);//找到報警節點結束,發現一條報警 if (i1 == -1 && i2 == -1)//沒有標誌結束 { break; } else if (i1 >= 0 && (i1 < i2 || i2 == -1))//找到軌跡結束節點 { strMsg = strMsg.Substring(i1 + "</attach-rules>".Length); startIndex = -1; endIndex = -1; continue; } else if (i2 > 0 && (i2 < i1 || i1 == -1))//找報警節點 { endIndex = i2;//找到報警節點結束,發現一條報警 string alarmXml = "<taskalarm>" + strMsg.Substring(startIndex, endIndex - startIndex + "</alarm>".Length) + "</taskalarm>";