在新的C# 5.0和.NET 4.5環境下,微軟爲C#加入了async/await,同時還加入新的System.Net.Http.dll類庫。這一切都大大簡化了(甚至能夠說是革命性得改變了)傳統.NET HTTP操做處理的方式。api
相比最新的模型,以前.NET 4.0和C# 4.0的時代的HTTP處理方式就顯得弱爆了。服務器
首先,若是寫成一異步的話。會創造一大堆難看的APM異步執行方法。若是用Lambda的話,就得嵌套多層,也會看着不爽。異步
其次,關於HTTP特有的,就是用戶必須手動把URL參數編碼而且正確鏈接而後放入到HTTP請求中。而.NET 4.5中的HttpContent類型的多個派生類型能夠支持更快捷的HTTP數據內容建立,咱們可使用FormUrlEncodedContent來完成上述需求。async
還有就是自動解壓縮HTTP迴應中的GZIP的問題:.NET 4.0中在HttpWebRequest的AutomaticDecompression屬性中,在.NET 4.5中的HttpClient類型中,可使用HttpClientHandler的AutomaticDecompression屬性,先後二者對應值都是DecompressionMethods枚舉類型,這個類型在.NET 2.0就有了。所以命名空間在System.Net中。編碼
咱們能夠拿一個街旁網API來作演示,整個過程以下以下:url
1. 建立一個HTTP POST請求。spa
2. 服務器會返回GZip壓縮後的數據。code
3. 讀取並輸出結果。orm
代碼以下:對象
//C# 5.0+ / .NET 4.5+
//+ using System.Net;
//+ using System.Net.Http(需引用System.Net.Http.dll類庫);
static void Main(string[] args)
{
doo();
System.Threading.Thread.Sleep(-1);
}
static async void doo()
{
//設置必要參數
//示例API能夠參考:http://dev.jiepang.com/doc/get/users/show
var url = "http://api.jiepang.com/v1/users/show";
var userId = "633899402";
//設置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//建立HttpClient(注意傳入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent作HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"id", userId},
{"force_gzip", "1"}
});
//await異步等待迴應
var response = await http.PostAsync(url, content);
//await異步讀取最後的JSON(注意此時gzip已經被自動解壓縮了,由於上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}
運行後,若是成功的話會輸出包含用戶信息的JSON!
注意:
貌似街旁網已經把這個API改爲了了強制OAuth驗證(雖然文檔上還寫着「不須要驗證」)。因此運行結果不會輸出帳戶信息,而會輸出有包含錯誤信息的JSON。不過無所謂了,正確輸出HTTP迴應GZip數據中的結果,就是咱們想要的。
注意能夠經過HttpClient類型的EnsureSuccessStatusCode來確保HTTP迴應返回狀態成功,不然會拋出異常。
//確保HTTP成功狀態值(response對應HttpResponseMessage對象)
response.EnsureSuccessStatusCode();
上述API使用了一個顯示參數來指定須要返回GZIP數據迴應,也能夠經過設置HTTP請求的AcceptEncoding,以下,手動加入GZIP類型:
//+ System.Net.Http;
//+ System.Net.Http.Headers
//http是HttpClient對象
//也能夠手動構建HttpRequestMessage,而後經過HttpClient.SendAsync來發送
http.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("GZIP"));
http是HttpClient對象,它的DefaultRequestHeaders返回HttpRequestHeaders對象。固然也能夠手動構建HttpRequestMessage而後修改HttpRequestHeaders,而後經過HttpClient.SendAsync來發送。另外注意StringWithQualityHeaderValue類型在System.Net.Http.Headers命名空間內。