C#中HttpWebRequest、WebClient、HttpClient怎么用

這篇文章給大家分享的是有關(guān)C#中HttpWebRequest、WebClient、HttpClient怎么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)建站為企業(yè)級(jí)客戶提高一站式互聯(lián)網(wǎng)+設(shè)計(jì)服務(wù),主要包括網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、app軟件開發(fā)重慶小程序開發(fā)公司、宣傳片制作、LOGO設(shè)計(jì)等,幫助客戶快速提升營銷能力和企業(yè)形象,創(chuàng)新互聯(lián)各部門都有經(jīng)驗(yàn)豐富的經(jīng)驗(yàn),可以確保每一個(gè)作品的質(zhì)量和創(chuàng)作周期,同時(shí)每年都有很多新員工加入,為我們帶來大量新的創(chuàng)意。 

HttpWebRequest:

命名空間: System.Net,這是.NET創(chuàng)建者最初開發(fā)用于使用HTTP請(qǐng)求的標(biāo)準(zhǔn)類。使用HttpWebRequest可以讓開發(fā)者控制請(qǐng)求/響應(yīng)流程的各個(gè)方面,如 timeouts, cookies, headers, protocols。另一個(gè)好處是HttpWebRequest類不會(huì)阻塞UI線程。例如,當(dāng)您從響應(yīng)很慢的API服務(wù)器下載大文件時(shí),您的應(yīng)用程序的UI不會(huì)停止響應(yīng)。HttpWebRequest通常和WebResponse一起使用,一個(gè)發(fā)送請(qǐng)求,一個(gè)獲取數(shù)據(jù)。HttpWebRquest更為底層一些,能夠?qū)φ麄€(gè)訪問過程有個(gè)直觀的認(rèn)識(shí),但同時(shí)也更加復(fù)雜一些。

//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是一種更高級(jí)別的抽象,是HttpWebRequest為了簡(jiǎn)化最常見任務(wù)而創(chuàng)建的,使用過程中你會(huì)發(fā)現(xiàn)他缺少基本的header,timeoust的設(shè)置,不過這些可以通過繼承httpwebrequest來實(shí)現(xiàn)。相對(duì)來說,WebClient比WebRequest更加簡(jiǎn)單,它相當(dāng)于封裝了request和response方法,不過需要說明的是,Webclient和WebRequest繼承的是不同類,兩者在繼承上沒有任何關(guān)系。使用WebClient可能比HttpWebRequest直接使用更慢(大約幾毫秒),但卻更為簡(jiǎn)單,減少了很多細(xì)節(jié),代碼量也比較少。

public class WebClientHelper  {    public static string DownloadString(string url)    {      WebClient wc = new WebClient();      //wc.BaseAddress = url;  //設(shè)置根目錄      wc.Encoding = Encoding.UTF8;  //設(shè)置按照何種編碼訪問,如果不加此行,獲取到的字符串中文將是亂碼      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);  //新建一個(gè)讀取流,用指定的編碼讀取,此處是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);  //下載到字節(jié)數(shù)組      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());  //觸發(fā)事件的對(duì)象      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("下載中。。。");    }  }

HttpClient:

HttpClient是.NET4.5引入的一個(gè)HTTP客戶端庫,其命名空間為 System.Net.Http ,.NET 4.5之前我們可能使用WebClient和HttpWebRequest來達(dá)到相同目的。HttpClient利用了最新的面向任務(wù)模式,使得處理異步請(qǐng)求非常容易。它適合用于多次請(qǐng)求操作,一般設(shè)置好默認(rèn)頭部后,可以進(jìn)行重復(fù)多次的請(qǐng)求,基本上用一個(gè)實(shí)例可以提交任何的HTTP請(qǐng)求。HttpClient有預(yù)熱機(jī)制,第一次進(jìn)行訪問時(shí)比較慢,所以不應(yīng)該用到HttpClient就new一個(gè)出來,應(yīng)該使用單例或其他方式獲取HttpClient的實(shí)例

單例模式:

單例模式(Singleton Pattern)這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。

這種模式涉及到一個(gè)單一的類,該類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供了一種訪問其唯一的對(duì)象的方式,可以直接訪問,不需要實(shí)例化該類的對(duì)象。

單例創(chuàng)建步驟:1、定義靜態(tài)私有對(duì)象;2、定義私有構(gòu)造函數(shù);3、提供公共獲取對(duì)象方法;

單例模式一般分為兩種實(shí)現(xiàn)模式:懶漢模式、餓漢模式(以下為Java代碼實(shí)現(xiàn))

懶漢模式:  默認(rèn)不會(huì)實(shí)例化,什么時(shí)候用什么時(shí)候new

public class Singleton {   private static Singleton instance = null;   private Singleton (){}    public static Singleton getInstance() {   if (instance == null) {     instance = new Singleton();   }   return instance;   } }

這種方式是最基本的實(shí)現(xiàn)方式,這種實(shí)現(xiàn)最大的問題就是不支持多線程。因?yàn)闆]有加鎖 synchronized,所以嚴(yán)格意義上它并不算單例模式。這種方式 lazy loading 很明顯,不要求線程安全,在多線程不能正常工作。

餓漢模式:  類初始化時(shí),會(huì)立即加載該對(duì)象,線程天生安全,調(diào)用效率高

public class Singleton {   private static Singleton instance = new Singleton();   private Singleton (){}   public static Singleton getInstance() {   return instance;   } }

雙檢鎖/雙重校驗(yàn)鎖(DCL,即 double-checked locking):這種方式采用雙鎖機(jī)制,安全且在多線程情況下能保持高性能

public class Singleton {   private volatile static Singleton singleton;   private Singleton (){}   public static Singleton getSingleton() {   if (singleton == null) {     synchronized (Singleton.class) {     if (singleton == null) {       singleton = new Singleton();     }     }   }   return singleton;   } }

HttpClient:

public class HttpClientHelper  {    private static readonly object LockObj = new object();    private static HttpClient client = null;    public HttpClientHelper() {      GetInstance();    }    public static HttpClient GetInstance()    {      if (client == null)      {        lock (LockObj)        {          if (client == null)          {            client = new HttpClient();          }        }      }      return client;    }    public async Task<string> PostAsync(string url, string strJson)//post異步請(qǐng)求方法    {      try      {        HttpContent content = new StringContent(strJson);        content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");        //由HttpClient發(fā)出異步Post請(qǐng)求        HttpResponseMessage res = await client.PostAsync(url, content);        if (res.StatusCode == System.Net.HttpStatusCode.OK)        {          string str = res.Content.ReadAsStringAsync().Result;          return str;        }        else          return null;      }      catch (Exception ex)      {        return null;      }    }    public string Post(string url, string strJson)//post同步請(qǐng)求方法    {      try      {        HttpContent content = new StringContent(strJson);        content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");        //client.DefaultRequestHeaders.Connection.Add("keep-alive");        //由HttpClient發(fā)出Post請(qǐng)求        Task<HttpResponseMessage> res = client.PostAsync(url, content);        if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)        {          string str = res.Result.Content.ReadAsStringAsync().Result;          return str;        }        else          return null;      }      catch (Exception ex)      {        return null;      }    }    public string Get(string url)    {      try      {        var responseString = client.GetStringAsync(url);        return responseString.Result;      }      catch (Exception ex)      {        return null;      }    }  }

HttpClient有預(yù)熱機(jī)制,第一次請(qǐng)求比較慢;可以通過初始化前發(fā)送一次head請(qǐng)求解決:

_httpClient = new HttpClient() { BaseAddress = new Uri(BASE_ADDRESS) };    //幫HttpClient熱身    _httpClient.SendAsync(new HttpRequestMessage {        Method = new HttpMethod("HEAD"),         RequestUri = new Uri(BASE_ADDRESS + "/") })      .Result.EnsureSuccessStatusCode();

感謝各位的閱讀!關(guān)于“C#中HttpWebRequest、WebClient、HttpClient怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

文章名稱:C#中HttpWebRequest、WebClient、HttpClient怎么用
網(wǎng)址分享:http://muchs.cn/article42/ippshc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、微信小程序、云服務(wù)器外貿(mào)建站、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)