首先列出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(" --" + boundary + " "); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes(" --" + boundary + "-- "); int pos = path.LastIndexOf("\"); string fileName = path.Substring(pos + 1); //请求头部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}" Content-Type:application/octet-stream ", 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(" --" + boundary + " "); byte[] endBoundaryBytes = Encoding.UTF8.GetBytes(" --" + boundary + "-- "); //请求头部信息 StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name="file";filename="{0}" Content-Type:application/octet-stream ", 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 }
然后列出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; } }
2.带参数调用
private bool HandleIntelligentTask(string taskId,bool bStop) { try { if (!mIsConnect) { return false; } StringBuilder sb = new StringBuilder(); sb.AppendFormat("<request> "); sb.AppendFormat("<task_id>{0}</task_id> ", taskId);//<!-- task-id为调用方生成的UUID或其它串 --> sb.AppendFormat("<status>{0}</status> ",bStop?0:1); sb.AppendFormat("</request> "); 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; } }
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>"; Thread th = new Thread(new ThreadStart(delegate() { ParseAlarmXml(alarmXml); })); th.IsBackground = true; th.Start(); strMsg = strMsg.Substring(endIndex + "</alarm>".Length); startIndex = -1; endIndex = -1; continue; } } else { break; } } } } else { Console.WriteLine("##########读取报警反馈:无"); Thread.Sleep(1000); } } } catch (System.Threading.ThreadAbortException ex) { mLog.Info("AlarmCallBack...7"); try { if (stream != null) { stream.Close(); stream.Dispose(); response.Close(); } } catch { } mLog.Info("AlarmCallBack线程已人为终止!--0" + ex.Message, ex); } catch(IOException ex) { mLog.Info("AlarmCallBack...8"); try { if (stream != null) { stream.Close(); stream.Dispose(); response.Close(); } } catch { } } catch (ObjectDisposedException ex) { mLog.Info("AlarmCallBack...9"); mLog.Info("AlarmCallBack读取流已人为终止!--2" + ex.Message, ex); try { if (stream != null) { stream.Close(); stream.Dispose(); response.Close(); } } catch { } } catch (System.Exception ex) { mLog.Info("AlarmCallBack...10"); mLog.Error("AlarmCallBack 0:" + ex.Message,ex); try { if (stream != null) { stream.Close(); stream.Dispose(); response.Close(); } } catch { } } finally { } })); alarmThead[1].IsBackground = true; alarmThead[1].Start(); } catch (System.Exception ex) { mLog.Info("AlarmCallBack...11"); mLog.Error("AlarmCallBack 1:" + ex.Message,ex); mLog.Info("AlarmCallBack开始重新报警连接....3"); mTimes = 50; } finally { } }
以上就是简单的HttpHelper类的方法使用