好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

HttpHelper类的调用方法详解

本文实例为大家分享了HttpHelper类的方法使用,供大家参考,具体内容如下

首先列出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

  }

然后列出HttpHelper的调用

1、不带参数调用

?

public bool ConnectServer()

     {

       try

       {

         string url = "https://i.cnblogs测试数据" ;

 

         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>\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 ;

       }

 

     }

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

       {

        

       }

     }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

dy("nrwz");

查看更多关于HttpHelper类的调用方法详解的详细内容...

  阅读:45次