对于System.Net.Http的学习(一)——System.Net.Http 简介
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; ; }
相关文章
- 运行Vue在ASP.NET Core应用程序并部署在IIS上
- 学习ASP.NET Core Blazor编程系列七——新增图书
- 学习ASP.NET Core Blazor编程系列三——实体
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)
- 学习ASP.NET Core Razor 编程系列十七——分组
- 对于System.Net.Http的学习(三)——使用 HttpClient 检索与获取过程数据
- 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备 亡羊补牢,面试时如果发现回答不好,该怎么办? [UWP]在应用开发中安全使用文件资源 请教:WCF速度似乎比Remoting慢 WinForm的EXE破解(基于IL修改) WebApi实现单个文件的上传下载 Log4Net使用学习笔记 ASP.NET Core2基于RabbitMQ对Web前
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
- 【23种设计模式】享元模式(Flyweight Pattern) .Net Core实现
- Asp.Net读取服务器EXE文件的方法!(超简单实例)
- [C#] Direct2D 学习笔记 (一)vb.net转换为c#
- net 自带cache
- 《ASP.NET 开发从入门到精通》----2.3 编译和部署ASP.NET程序
- 《.NET程序员面试秘笈》----面试题2 用代码描述类和对象的区别
- asp.net mvc中配置路由默认值(Area中)
- .net Json 反序列化时,属性带点
- Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串
- 在asp.net web form项目中添加webapi接口