当前位置 主页 > 网站技术 > 代码类 >

    C#中HttpWebRequest、WebClient、HttpClient的使用详解

    栏目:代码类 时间:2019-12-23 15:11

    HttpWebRequest:

    命名空间: System.Net,这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面,如 timeouts, cookies, headers, protocols。另一个好处是HttpWebRequest类不会阻塞UI线程。例如,当您从响应很慢的API服务器下载大文件时,您的应用程序的UI不会停止响应。HttpWebRequest通常和WebResponse一起使用,一个发送请求,一个获取数据。HttpWebRquest更为底层一些,能够对整个访问过程有个直观的认识,但同时也更加复杂一些。

         //POST方法
        public static string HttpPost(string Url, string postDataStr)
        {
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
          request.Method = "POST";
          request.ContentType = "application/x-www-form-urlencoded";
          Encoding encoding = Encoding.UTF8;
          byte[] postData = encoding.GetBytes(postDataStr);
          request.ContentLength = postData.Length;
          Stream myRequestStream = request.GetRequestStream();
          myRequestStream.Write(postData, 0, postData.Length);
          myRequestStream.Close();
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          Stream myResponseStream = response.GetResponseStream();
          StreamReader myStreamReader = new StreamReader(myResponseStream, encoding);
          string retString = myStreamReader.ReadToEnd();
          myStreamReader.Close();
          myResponseStream.Close();
    
          return retString;
        }
        //GET方法
        public static string HttpGet(string Url, string postDataStr)
        {
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
          request.Method = "GET";
          request.ContentType = "text/html;charset=UTF-8";
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          Stream myResponseStream = response.GetResponseStream();
          StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
          string retString = myStreamReader.ReadToEnd();
          myStreamReader.Close();
          myResponseStream.Close();
          return retString;
        }
    
    

    WebClient:

    命名空间System.Net,WebClient是一种更高级别的抽象,是HttpWebRequest为了简化最常见任务而创建的,使用过程中你会发现他缺少基本的header,timeoust的设置,不过这些可以通过继承httpwebrequest来实现。相对来说,WebClient比WebRequest更加简单,它相当于封装了request和response方法,不过需要说明的是,Webclient和WebRequest继承的是不同类,两者在继承上没有任何关系。使用WebClient可能比HttpWebRequest直接使用更慢(大约几毫秒),但却更为简单,减少了很多细节,代码量也比较少。

    public class WebClientHelper
      {
        public static string DownloadString(string url)
        {
          WebClient wc = new WebClient();
          //wc.BaseAddress = url;  //设置根目录
          wc.Encoding = Encoding.UTF8;  //设置按照何种编码访问,如果不加此行,获取到的字符串中文将是乱码
          string str = wc.DownloadString(url);
          return str;
        }
        public static string DownloadStreamString(string url)
        {
          WebClient wc = new WebClient();
          wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36");
          Stream objStream = wc.OpenRead(url);
          StreamReader _read = new StreamReader(objStream, Encoding.UTF8);  //新建一个读取流,用指定的编码读取,此处是utf-8
          string str = _read.ReadToEnd();
          objStream.Close();
          _read.Close();
          return str;
        }
    
        public static void DownloadFile(string url, string filename)
        {
          WebClient wc = new WebClient();
          wc.DownloadFile(url, filename);   //下载文件
        }
    
        public static void DownloadData(string url, string filename)
        {
          WebClient wc = new WebClient();
          byte [] bytes = wc.DownloadData(url);  //下载到字节数组
          FileStream fs = new FileStream(filename, FileMode.Create);
          fs.Write(bytes, 0, bytes.Length); 
          fs.Flush();
          fs.Close();
        }
    
        public static void DownloadFileAsync(string url, string filename)
        {
          WebClient wc = new WebClient();
          wc.DownloadFileCompleted += DownCompletedEventHandler;
          wc.DownloadFileAsync(new Uri(url), filename);
          Console.WriteLine("下载中。。。");
        }
        private static void DownCompletedEventHandler(object sender, AsyncCompletedEventArgs e)
        {
          Console.WriteLine(sender.ToString());  //触发事件的对象
          Console.WriteLine(e.UserState);
          Console.WriteLine(e.Cancelled);
          Console.WriteLine("异步下载完成!");
        }
    
        public static void DownloadFileAsync2(string url, string filename)
        {
          WebClient wc = new WebClient();
          wc.DownloadFileCompleted += (sender, e) =>
          {
            Console.WriteLine("下载完成!");
            Console.WriteLine(sender.ToString());
            Console.WriteLine(e.UserState);
            Console.WriteLine(e.Cancelled);
          };
          wc.DownloadFileAsync(new Uri(url), filename);
          Console.WriteLine("下载中。。。");
        }
      }