C# HttpClient, 使用C#操做Web

咱們知道, .Net類庫裏提供了HttpWebRequest等類,方便咱們編程與Web服務器進行交互. 可是實際使用中咱們常常會遇到如下需求,基礎類裏沒有直接提供相應的功能(WebClient類包含這些功能,只是用起來稍微麻煩一點--謝謝網友東吳居士的提醒):html

  • 對HttpWebResponse獲取的HTML進行文字編碼轉換,使之不會出現亂碼;
  • 自動在Session間保持Cookie,Referer等相關信息;
  • 模擬HTML表單提交;
  • 向服務器上傳文件;
  • 對二進制的資源,直接獲取返回的字節數組(byte[]),或者保存爲文件

爲了解決這些問題,我開發了HttpClient類.下面是使用的方法:web

  • 獲取編碼轉換後的字符串

    HttpClient client=new HttpClient(url);
    string html=client.GetString();

    GetString()函數內部會查找Http Headers, 以及HTML的Meta標籤,試圖找出獲取的內容的編碼信息.若是都找不到,它會使用client.DefaultEncoding, 這個屬性默認爲utf-8, 也能夠手動設置.
  • 自動保持Cookie, Referer

    HttpClient client=new HttpClient(url1, null, true);
    string html1=client.GetString();
    client.Url=url2;
    string html2=client.GetString();

    這裏HttpClient的第三個參數,keepContext設置爲真時,HttpClient會自動記錄每次交互時服務器對Cookies進行的操做,同時會之前一次請求的Url爲Referer.在這個例子裏,獲取html2時,會把url1做爲Referer, 同時會向服務器傳遞在獲取html1時服務器設置的Cookies. 固然,你也能夠在構造HttpClient時直接提供第一次請求要發出的Cookies與Referer:

    HttpClient client=new HttpClient(url, new WebContext(cookies, referer), true);

    或者,在使用過程當中隨時修改這些信息:

    client.Context.Cookies=cookies;
    client.Context.referer=referer;
  • 模擬HTML表單提交

    HttpClient client=new HttpClient(url);
    client.PostingData.Add(fieldName1, filedValue1);
    client.PostingData.Add(fieldName2, fieldValue2);
    string html=client.GetString();

    上面的代碼至關於提交了一個有兩個input的表單. 在PostingData非空,或者附加了要上傳的文件時(請看下面的上傳和文件), HttpClient會自動把HttpVerb改爲POST, 並將相應的信息附加到Request上.
  • 向服務器上傳文件

    HttpClient client=new HttpClient(url);
    client.AttachFile(fileName, fieldName);
    client.AttachFile(byteArray, fileName, fieldName);
    string html=client.GetString();

    這裏面的fieldName至關於<input type="file" name="fieldName" />裏的fieldName. fileName固然就是你想要上傳的文件路徑了. 你也能夠直接提供一個byte[] 做爲文件內容, 但即便如此,你也必須提供一個文件名,以知足HTTP規範的要求.
  • 不一樣的返回形式

    字符串: string html = client.GetString();
    流: Stream stream = client.GetStream();
    字節數組: byte[] data = client.GetBytes();
    保存到文件:  client.SaveAsFile(fileName);
    或者,你也能夠直接操做HttpWebResponse: HttpWebResponse res = client.GetResponse();

    每調用一次上述任何一個方法,都會致使發出一個HTTP Request, 也就是說,你不能同時獲得某個Response的兩種返回形式.
    另外,調用後它們任意一個以後,你能夠經過client.ResponseHeaders來獲取服務器返回的HTTP頭.
  • 下載資源的指定部分(用於斷點續傳,多線程下載)

    HttpClient client=new HttpClient(url);
    //發出HEAD請求,獲取資源長度
    int length=client.HeadContentLength();

    //只獲取後一半內容
    client.StartPoint=length/2;
    byte[] data=client.GetBytes();

    HeadContentLength()只會發出HTTP HEAD請求.根據HTTP協議, HEAD與GET的做用等同, 可是,只返回HTTP頭,而不返回資源主體內容. 也就是說,用這個方法,你無法獲取一個須要經過POST才能獲得的資源的長度,若是你確實有這樣的需求,建議你能夠經過GetResponse(),而後從ResponseHeader裏獲取Content-Length.

計劃中還有另一些功能要加進來,好比斷點續傳, 多線程下載, 下載進度更新的事件機制等, 正在思考如何與如今的代碼融合到一塊兒,期待你的反饋.編程

你能夠從這裏下載目前版本的所有代碼.api

 

注意:使用時應該添加對System.Web.dll的引用,並在使用此類的代碼前添加"using System.Web;",否則會沒法經過編譯.數組

 

 

HttpClient + ASP.NET Web API, WCF以外的另外一個選擇  服務器

 

HttpContext.Current.Response.Redirect   經過http請求發送到客戶端的,由客戶端去訪問cookie

由服務器去調用 模仿客戶端    多線程

var client = new System.Net.Http.HttpClient();函數

var result = client.GetStringAsync("http://內網地址").Result;
if (result == "被調用方返回登陸完成的結果")
{
     //反饋 成功
}
else
{
      //反饋失敗
}post

相關文章
相關標籤/搜索