最新在學習System.Net.Http的知識,看到有篇文章寫的十分詳細,就想轉過來,自己記錄下。原地址是http://www.cnblogs.com/chillsrc/p/3439215.html?utm_source=tuicool&utm_medium=referralSystem.Net.H...
最新在學習System.Net.Http的知識,看到有篇文章寫的十分詳細,就想轉過來,自己記錄下。原地址是http://www.cnblogs.com/chillsrc/p/3439215.html?utm_source=tuicool&utm_medium=referral
System.Net.Http 是微軟推出的最新的 HTTP 應用程式的編程介面, 微軟稱之為“現代化的 HTTP 編程介面”, 主要提供如下內容:
1. 用戶通過 HTTP 使用現代化的 Web Service 的客戶端組件;
2. 能夠同時在客戶端與服務端同時使用的 HTTP 組件(比如處理 HTTP 標頭和消息), 為客戶端和服務端提供一致的編程模型。
命名空間 System.Net.Http 以及 System.Net.Http.Headers 提供瞭如下內容:
1. HttpClient 發送和接收 HTTP 請求與響應;
2. HttpRequestMessage and HttpResponseMessage 封裝了 RFC 2616 定義的 HTTP 消息;
3. HttpHeaders 封裝了 RFC 2616 定義的 HTTP 標頭;
4. HttpClientHandler 負責生成HTTP響應消息的HTTP處理程式。
System.Net.Http 能夠處理多種類型的 RFC 2616 定義的 HTTP 實體正文, 如下圖所示:
此外, System.Net.Http 對 HTTP 消息的處理採用了職責鏈模式, 這裡有一遍不錯的介紹, 這裡就不再多說了。
System.Net.Http 最早是和 Asp.Net Mvc4 同時出現, 是一個第三方組件,名稱是Microsoft HTTP Client Libraries,可以在 .Net 4.0 中使用。 隨著 .Net 4.5 的發佈, System.Net.Http 正式成為 .Net 基礎類庫, 目前已經可以在 .Net 4.0/4.5 、 Windows Phone 、 以及 Windows Store App 中使用。
HttpClient 組件類實例為一個會話發送 HTTP 請求。 HttpClient 實例設置為集合會應用於該實例執行的所有請求。 此外,每 HttpClient 實例使用自己的連接池,隔離其他 HttpClient實例的執行請求。 HttpClient 也是更具體的 HTTP 客戶端的基類。
預設情況下,使用 HttpWebRequest 向伺服器發送請求。 這一行為可通過在接受一個HttpMessageHandler實例作為參數的構造函數重載中指定不同的通道來更改。
如果需要身份驗證或緩存的功能,WebRequestHandler 可使用配置項和實例傳遞給構造函數。 返回的處理程式傳遞到採用 HttpMessageHandler 參數的某構造進行返回參數傳遞。
如果使用 HttpClient 和相關組件類的 app 在 System.Net.Http 命名空間用於下載大量數據 (可達 50 MB 或更多),則應用程式應這些下載的流和不使用預設值緩衝區。 如果使用預設值緩衝區客戶端記憶體使用量會非常大,可能會導致顯著降低的性能。
對於 HttpClient的基本使用方法,示例代碼如下:
//聲明HttpClient
HttpClient client = new HttpClient
{
BaseAddress = new Uri("http://www.163.com")
};
//多線程中跨線程進行信息顯示委托
public delegate void ShowMsgDelegate(string text);
public void ShowMsgText(string text)
{
txtMsg.Text=text;
}
//信息顯示
private void ShowMessage(string msg)
{
if (this.InvokeRequired)
{
this.Invoke(new ShowMsgDelegate(ShowMsgText), msg);
}
else
{
ShowMsgText(msg);
}
}
// Get form data to server
private void btnGet_Click(object sender, EventArgs e)
{
// Get string from server
client.GetStringAsync("browserhttp/").ContinueWith(t =>
{
if (t.IsFaulted)
{
ShowMessage("返回信息錯誤:" + t.Result);
}
else
{
ShowMessage("成功:" + t.Result);
}
});
}
// Post form data to server
private void btnPost_Click(object sender, EventArgs e)
{
var param = new Dictionary<string, string> {
{"Name", "TOM Post"},
{"Age", "11"},
{"Birthday", DateTime.Now.ToString("yyyyMMdd")}
};
client.PostAsync("browserhttp/", new FormUrlEncodedContent(param)).ContinueWith(t =>
{
ShowMsgDelegate showmsg = new ShowMsgDelegate(ShowMsgText);
if (t.IsFaulted)
{
ShowMessage("返回信息錯誤:" + t.Result);
}
else
{
HttpResponseMessage response = t.Result;
ShowMessage(response.StatusCode.ToString());
}
});
}
// PUT to update
private void btnPut_Click(object sender, EventArgs e)
{
var param = new Dictionary<string, string> {
{"Id", "10" },
{"Name", "Tom Post"},
{"Age", "10"},
{"Birthday", DateTime.Now.ToString("yyyyMMdd")}
};
client.PutAsync("clienthttp/1", new FormUrlEncodedContent(param)).ContinueWith(t =>
{
if (t.IsFaulted)
{
ShowMessage("返回信息錯誤:" + t.Result);
}
else
{
HttpResponseMessage response = t.Result;
ShowMessage(response.StatusCode.ToString());
}
});
}
// DELETE
private void btnDel_Click(object sender, EventArgs e)
{
client.DeleteAsync("clienthttp/1").ContinueWith(t =>
{
if (t.IsFaulted)
{
ShowMessage("返回信息錯誤:" + t.Result);
}
else
{
HttpResponseMessage response = t.Result;
ShowMessage(response.StatusCode.ToString());
}
});
}
支持職責鏈模式的 MessageProcessingHandler ,MessageProcessingHandler - 一種基本的 HTTP 消息處理程式。這是最容易進行派生的處理程式,應該作為大多數自定義處理程式的起點。 自已定義了一個新的MessageProcessingHandler處理程式,如下麵的示例代碼所示:
public class CustomProcessingHandler : MessageProcessingHandler {
protected override HttpRequestMessage ProcessRequest(HttpRequestMessage request, CancellationToken cancellationToken) {
if (request.Method != HttpMethod.Get && request.Method != HttpMethod.Post) {
request.Headers.TryAddWithoutValidation("RequestMethod", request.Method.Method);
request.Method = HttpMethod.Post;
}
return request;
}
protected override HttpResponseMessage ProcessResponse(HttpResponseMessage response, CancellationToken cancellationToken) {
var request = response.RequestMessage;
if (request.Headers.Contains("RequestMethod")) {
IEnumerable<string> values;
if (request.Headers.TryGetValues("RequestMethod", out values)) {
request.Method = new HttpMethod(values.First());
}
}
return response;
}
}
使用起來也是非常簡單的:
private void btnCustom_Click(object sender, EventArgs e)
{
var customHandler = new CustomProcessingHandler
{
InnerHandler = new HttpClientHandler()
};
var client = new HttpClient(customHandler, true)
{
BaseAddress = new Uri("http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl")
};
var task = client.GetAsync(client.BaseAddress);
task.Result.EnsureSuccessStatusCode();
HttpResponseMessage response = task.Result;
txtStatusCode.Text = response.StatusCode + " " + response.ReasonPhrase + Environment.NewLine;
txtStatusText.Text = "請求返回結果如下 ...";
var result = response.Content.ReadAsStringAsync();
txtMsg.Text = result.Result; ;
}