对于System.Net.Http的学习(一)——System.Net.Http 简介(转)
最新在学习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; ;
}
对于System.Net.Http的学习(一)——System.Net.Http 简介(转)的更多相关文章
- 对于System.Net.Http的学习(三)——使用 HttpClient 检索与获取过程数据
对于System.Net.Http的学习(一)——System.Net.Http 简介 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接 如何使用 HttpCli ...
- 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接
对于System.Net.Http的学习(一)——System.Net.Http 简介 使用 HttpClient 进行连接 使用 System.Net.Http 命名空间中的 HttpClient ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- Java学习之System.arraycopy()方法
java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少.System提供 ...
- .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...
- foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because 'System.Web.UI.WebControls.Table' does not contain a public definition for 'GetEnumerator'
错误:foreach statement cannot operate on variables of type 'System.Web.UI.WebControls.Table' because ' ...
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, ...
- 异常:“System.Reflection.Metadata”已拥有为“System.Collections.Immutable”定义的依赖项
参考动态执行T4模板:https://msdn.microsoft.com/zh-cn/library/bb126579.aspx 我项目是.NET Framework 4.5控制台应用程序写的. 执 ...
- 无法将类型“System.Nullable`1”强制转换为类型“System.Object”。LINQ to Entities 仅支持强制转换 EDM 基元或枚举类型。
在一个项目中使用LINQ和EF时出现了题目所示的异常,搜索了很多资料都找不到解决办法,主要是因为EF方面的知识欠缺. 先将情况记录如下,以供以后参考. 查询主要设计两张表,由外键关联: 在进行下面的查 ...
- Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)
在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...
随机推荐
- Hibernate、批量操作数据
Hibernate 批量操作数据可以使用两种方法实现 1.分批更新,每一小批同步一次数据: public void saveEmployee2(){ Session s=HibernateSessio ...
- 在mangento后台调用wysiwyg编辑器
在mangento后台调用操蛋的wysiwyg编辑器: 1.在头部加载TincyMCE protected function _prepareLayout() { parent::_prepa ...
- 怎样调通微信支付及微信发货通知接口(Js API)
怎样调通微信支付及微信发货通知接口(Js API) 微信支付提供了一个支付測试页面,微信支付正式使用须要測通支付.发货通知接口 .告警接口.维权接口.告警接口.维权接口非常easy.支付界面调通也相对 ...
- Codeforces 475C Kamal-ol-molk's Painting 模拟
主题链接:点击打开链接 意甲冠军:特定n*m矩阵 X代表色 .代表无色 随着x*y形刷子去涂色. 刷子每次能够→或↓移动随意步. 若可以染出给定的矩阵,则输出最小的刷子的面积 若不能输出-1 思路: ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...
- char* 和 wchar_t* 如何互相转换
char* 和 wchar_t* 如何互相转换 C函数可以用 wcstombs - 将宽字符转换成多字符 WCHAR -> CHAR mbstowcs - 把多字符把转换成宽字符 C ...
- leetcode Longest Valid Parentheses python
class Solution(object): def longestValidParentheses(self, s): """ :type s: str :rtype ...
- 出现"无法连接synaptics定点装置驱动程序"
"开始“--”运行“--regedit(打开注册表)--依次打开 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVERSION/R ...
- mysql获取各种日期
select curdate(); --获取当前日期 select last_day(curdate()); --获取当月最后一天. select DATE_ADD(curdate(),interva ...
- eclipse同步远程服务器
eclipse里有一个强大的插件,可以直接在本地编辑远程服务器代码,Eclipse Remote System Explorer (RSE) 下载安装方法: 一.下载,高版本的eclipse可以直接下 ...