源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 144|回复: 25

[ASP.NET] ASP.NET MVC Web API HttpClient简介

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2012-11-8 11:57:29 | 显示全部楼层 |阅读模式
依稀还记得那个时候用WebClient,HttpWebRequest来发送一个请求,现在ASP.NET MVC4中自带了一个类HttpClient;需要的朋友可以参考下 1.HttpClient简单介绍
依稀还记得那个时候用WebClient,HttpWebRequest来发送一个请求,现在ASP.NET MVC4中自带了一个类HttpClient,用于接收HttpResponseMessage和发送HttpRequestMesssage。
问题在于既然WebClient,HttpWebRequest可以完成相应的功能,为什么还要使用HttpClient类,.NET Framework中既然提出了这样一个类肯定是有其特别之处的,这里罗列几个不同之处:
(1) 可以在HttpClient实例上配置扩展,设置默认的头部,取消未完成的的请求和设置
(2) HttpClient有自己的连接池
(3) HttpClient 不与特定的服务器绑定,可以访问任何Http请求
(4) HttpClient采用异步请求处理

2.HttpClient备注说明
HttpClient包含在System.net.Http.dll 程序集中,用户接受和发送http请求,该类适用于.NET4.0以上版本。
默认情况下,HttpWebRequest 将用于向服务器发送请求。此行为可指定一个不同的通道修改在获取 HttpMessageHandler 实例的构造函数重载之一中作为参数。如果需要与身份验证的功能或缓存,WebRequestHandler 可用于配置设置,而实例可传递给构造函数。返回的处理程序传递到采用 HttpMessageHandler 参数的构造函数重载之一
更多说明可以参考微软官方网站:
http://msdn.microsoft.com/zh-cn/library/system.net.http.httpclient.aspx

3.HttpClient基本操作
复制代码 代码如下:
static void BasicMethod()
{
string url = "http://www.baidu.com";
HttpClient client = new HttpClient();
string content = client.GetStringAsync(url).Result;
Console.WriteLine(content);
}

以上是使用HttpClient请求百度主页,貌似操作起来也挺方便的,运行输出请求得到的结果如下图:
 
控制台输出的为请求URL的内容。
HttpClient除了上面提到的GetStringAsync()方法之外,还提供了如下Get方法,详细可以参考MSDN:


4.自定义请求头
如果要自定义请求头,我们需要继承一个类:HttpClientHandler
public class GitHttpClientHandler:HttpClientHandler 
复制代码 代码如下:
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
request.Headers.Referrer = new Uri("http://www.google.com/");
request.Headers.Add("UserAgent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727)");

Task<HttpResponseMessage> task = base.SendAsync(request, cancellationToken);
HttpResponseMessage response = task.Result;
MediaTypeHeaderValue contentType = response.Content.Headers.ContentType;
if (string.IsNullOrEmpty(contentType.CharSet))
{
contentType.CharSet = "GBK";
}
return task;
}
}

HttpClientHandler就是常见的代理模式,在HttpClient.GetStringAsync()加了一层封装,拦截了HttpClient的输入和输出,从而实现一些自定义的操作,这种方式我们在MVC 中非常常见,就是MVC中的过滤器。
5.请求内容过长
HttpClient有一个属性MaxResponseContentBufferSize,它表示读取相应内容是最大的字节缓存数,默认值是64K,当页面内容很多的时候,超过64K则会抛出异常HttpRequestException,导致Get失败。
我们可以人工设置这个属性的大小:
复制代码 代码如下:
HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1024 * 1024 };

用如上方式处理即可。
6.中文问题
中文问题总是令人头疼,很多时候会出现乱码。上面提到的自定义请求头也可以处理,这里贴出一段代码作参考,中文问题有点复杂需要根据具体情况处理:
复制代码 代码如下:
HttpResponseMessage response = task.Result;
MediaTypeHeaderValue contentType = response.Content.Headers.ContentType;
if(string.IsNullOrEmpty(contentType.CharSet))
{
contentType.CharSet = "GBK";
}

回复

使用道具 举报

1

主题

2万

回帖

307

积分

中级会员

Rank: 3Rank: 3

积分
307
发表于 2022-10-10 07:48:12 | 显示全部楼层
谢谢小Y分享
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

79

积分

注册会员

Rank: 2

积分
79
发表于 2022-12-5 23:39:50 | 显示全部楼层
天天源码社区论坛
回复 支持 反对

使用道具 举报

1

主题

2万

回帖

362

积分

中级会员

Rank: 3Rank: 3

积分
362
发表于 2023-2-5 11:02:10 | 显示全部楼层
先把创新班才能下班才能下班
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-2-18 00:42:36 | 显示全部楼层
哈哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

69

积分

注册会员

Rank: 2

积分
69
发表于 2023-8-9 12:16:06 | 显示全部楼层
先把创新班才能下班才能下班
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-8-30 17:34:58 | 显示全部楼层
问问问企鹅哇哇哇哇哇
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

61

积分

注册会员

Rank: 2

积分
61
发表于 2023-12-3 22:08:23 | 显示全部楼层
儿飞飞微风DVD谁vdsvd
回复 支持 反对

使用道具 举报

6

主题

1万

回帖

174

积分

注册会员

Rank: 2

积分
174
发表于 2024-2-11 14:18:16 | 显示全部楼层
看看看看
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

172

积分

注册会员

Rank: 2

积分
172
发表于 2024-4-13 16:06:03 | 显示全部楼层
看看看看
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2025-1-20 16:18 , Processed in 0.076718 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表