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 中使用。
隔离其他
默认情况下,使用 HttpWebRequest 向服务器发送请求。 这一行为可通过在接受一个HttpMessageHandler实例作为参数的构造函数重载中指定不同的通道来更改。
如果需要身份验证或缓存的功能,WebRequestHandler 可使用配置项和实例传递给构造函数。 返回的处理程序传递到采用 HttpMessageHandler 参数的某构造进行返回参数传递。
如果使用 HttpClient 和相关组件类的 app 在 System.Net.Http 命名空间用于下载大量数据 (可达 50 MB 或更多),则应用程序应这些下载的流和不使用默认值缓冲区。 如果使用默认值缓冲区客户端内存使用量会非常大,可能会导致显着降低的性能。
对于 HttpClient的基本使用方法,示例代码如下:
//声明HttpClient HttpClient client = new HttpClient { BaseAddress = ) }; ShowMsgDelegate(string text); public void ShowMsgText(string text) { txtMsg.Text=text; } ShowMessage(string msg) { if (this.InvokeRequired) { this.Invoke(new ShowMsgDelegate(ShowMsgText), msg); } else { ShowMsgText(msg); } } btnGet_Click(object sender, EventArgs e) { // Get string from server client.GetStringAsync().ContinueWith(t => { if (t.IsFaulted) { ShowMessage(+ t.Result); } else { ShowMessage(+ t.Result); } }); } btnPost_Click(object sender, EventArgs e) { var param = new Dictionary<string, string> { {, }, {, }, {, DateTime.Now.ToString()} }; client.PostAsync(, 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()); } }); } btnPut_Click(object sender, EventArgs e) { var param = new Dictionary<string, string> { {, }, {, }, {, }, {, DateTime.Now.ToString()} }; client.PutAsync(, new FormUrlEncodedContent(param)).ContinueWith(t => { if (t.IsFaulted) { ShowMessage(+ t.Result); } else { HttpResponseMessage response = t.Result; ShowMessage(response.StatusCode.ToString()); } }); } btnDel_Click(object sender, EventArgs e) { client.DeleteAsync().ContinueWith(t => { if (t.IsFaulted) { ShowMessage(+ t.Result); } else { HttpResponseMessage response = t.Result; ShowMessage(response.StatusCode.ToString()); } }); }