欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC Web API HttpClient简介

程序员文章站 2024-03-05 14:09:06
1.httpclient简单介绍 依稀还记得那个时候用webclient,httpwebrequest来发送一个请求,现在asp.net mvc4中自带了一个类httpcl...
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请求百度主页,貌似操作起来也挺方便的,运行输出请求得到的结果如下图:
ASP.NET MVC Web API HttpClient简介 
控制台输出的为请求url的内容。
httpclient除了上面提到的getstringasync()方法之外,还提供了如下get方法,详细可以参考msdn:

ASP.NET MVC Web API HttpClient简介
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";
}