最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年12月23日 11:27:55   作者:麥克斯雪碧  
這篇文章主要介紹了C#中HttpWebRequest、WebClient、HttpClient的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

HttpWebRequest:

命名空間: System.Net,這是.NET創(chuàng)建者最初開發(fā)用于使用HTTP請求的標準類。使用HttpWebRequest可以讓開發(fā)者控制請求/響應(yīng)流程的各個方面,如 timeouts, cookies, headers, protocols。另一個好處是HttpWebRequest類不會阻塞UI線程。例如,當您從響應(yīng)很慢的API服務(wù)器下載大文件時,您的應(yīng)用程序的UI不會停止響應(yīng)。HttpWebRequest通常和WebResponse一起使用,一個發(fā)送請求,一個獲取數(shù)據(jù)。HttpWebRquest更為底層一些,能夠?qū)φ麄€訪問過程有個直觀的認識,但同時也更加復(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是一種更高級別的抽象,是HttpWebRequest為了簡化最常見任務(wù)而創(chuàng)建的,使用過程中你會發(fā)現(xiàn)他缺少基本的header,timeoust的設(shè)置,不過這些可以通過繼承httpwebrequest來實現(xiàn)。相對來說,WebClient比WebRequest更加簡單,它相當于封裝了request和response方法,不過需要說明的是,Webclient和WebRequest繼承的是不同類,兩者在繼承上沒有任何關(guān)系。使用WebClient可能比HttpWebRequest直接使用更慢(大約幾毫秒),但卻更為簡單,減少了很多細節(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);  //新建一個讀取流,用指定的編碼讀取,此處是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ā)事件的對象
      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引入的一個HTTP客戶端庫,其命名空間為 System.Net.Http ,.NET 4.5之前我們可能使用WebClient和HttpWebRequest來達到相同目的。HttpClient利用了最新的面向任務(wù)模式,使得處理異步請求非常容易。它適合用于多次請求操作,一般設(shè)置好默認頭部后,可以進行重復(fù)多次的請求,基本上用一個實例可以提交任何的HTTP請求。HttpClient有預(yù)熱機制,第一次進行訪問時比較慢,所以不應(yīng)該用到HttpClient就new一個出來,應(yīng)該使用單例或其他方式獲取HttpClient的實例

單例模式:

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

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

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

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

懶漢模式:  默認不會實例化,什么時候用什么時候new

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

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

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

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

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

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異步請求方法
    {
      try
      {
        HttpContent content = new StringContent(strJson);
        content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
        //由HttpClient發(fā)出異步Post請求
        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同步請求方法
    {
      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請求
        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ù)熱機制,第一次請求比較慢;可以通過初始化前發(fā)送一次head請求解決:

_httpClient = new HttpClient() { BaseAddress = new Uri(BASE_ADDRESS) };

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

三者區(qū)別列表:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器的示例代碼

    這篇文章主要介紹了C# Socket編程實現(xiàn)簡單的局域網(wǎng)聊天器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Unity報錯InvalidOperationException: out of sync的解決

    Unity報錯InvalidOperationException: out of sync的解決

    今天在做個東西,發(fā)現(xiàn)報錯,特此來記錄一下,本文介紹了Unity報錯InvalidOperationException: out of sync的解決,感興趣的可以了解一下
    2021-05-05
  • 詳解C#中IAsyncDisposable接口的使用

    詳解C#中IAsyncDisposable接口的使用

    在.NET Core 3.0的版本更新中,官方我們帶來了一個新的接口 IAsyncDisposable,下面小編就來和大家聊聊它的簡單使用吧,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • 字符串和十六進制之間的轉(zhuǎn)換方法實例

    字符串和十六進制之間的轉(zhuǎn)換方法實例

    這篇文章介紹了字符串和十六進制之間的轉(zhuǎn)換方法實例,有需要的朋友可以參考一下
    2013-11-11
  • 利用C#實現(xiàn)合并Word文檔功能

    利用C#實現(xiàn)合并Word文檔功能

    合并Word文檔可以快速地將多份編輯好的文檔合在一起,避免復(fù)制粘貼時遺漏內(nèi)容,以及耗費不必要的時間。本文將分為以下兩部分介紹如何通過C#合并Word文檔,并附上VB.NET代碼供大家參考,希望對大家有所幫助
    2022-12-12
  • C#實現(xiàn)拷貝文件到另一個文件夾下

    C#實現(xiàn)拷貝文件到另一個文件夾下

    這篇文章主要介紹了C#實現(xiàn)拷貝文件到另一個文件夾下,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用C#實現(xiàn)上位機與PLC通信的過程詳解

    使用C#實現(xiàn)上位機與PLC通信的過程詳解

    隨著工業(yè)自動化技術(shù)的不斷發(fā)展,PLC(可編程邏輯控制器)已成為現(xiàn)代生產(chǎn)過程中不可或缺的設(shè)備,為了實現(xiàn)設(shè)備之間的數(shù)據(jù)交換和遠程控制,上位機系統(tǒng)需要與PLC進行通信,在本文中,我們將從零開始,介紹如何使用C#實現(xiàn)上位機與PLC的通信,需要的朋友可以參考下
    2025-01-01
  • c#?COM組件原理詳解

    c#?COM組件原理詳解

    本文主要介紹了c#?COM組件原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • C#高效比較兩個DataTable數(shù)據(jù)差異化的方法實現(xiàn)

    C#高效比較兩個DataTable數(shù)據(jù)差異化的方法實現(xiàn)

    本文主要介紹了C#高效比較兩個DataTable數(shù)據(jù)差異化的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • c#程序定期把內(nèi)存信息記錄到log日志示例

    c#程序定期把內(nèi)存信息記錄到log日志示例

    這篇文章主要介紹了c#程序定期把內(nèi)存信息記錄到log日志示例,需要的朋友可以參考下
    2014-04-04

最新評論

五家渠市| 虎林市| 谢通门县| 曲松县| 尤溪县| 北票市| 阜康市| 东方市| 临清市| 泰州市| 普洱| 荥经县| 茂名市| 隆子县| 赞皇县| 两当县| 长宁区| 长汀县| 梁河县| 齐齐哈尔市| 伽师县| 九江市| 延吉市| 黑龙江省| 嵊泗县| 孟州市| 拉萨市| 西林县| 红桥区| 乌兰浩特市| 景东| 民乐县| 昔阳县| 浦东新区| 乐山市| 天门市| 建宁县| 格尔木市| 房山区| 九寨沟县| 汉阴县|