1.对HttpClient的简单介绍依稀记得,当时是用WebClient、HttpWebRequest来发送请求的。现在,ASP.NET mvc4附带了一个类httpclient,用于接收HttpResponseMessage和发送HttpRequestMesssage。问题是,既然WebClient、HttpWebRequest都可以完成相应的功能,为什么还要用HttpClient类呢?因为这样的类是在。NET框架,它必须有自己的特色。这里有一些不同。 (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/.系统基本操作的复制代码。net . http . httpclient . aspx 3 . httpclient如下: static void basic method(){ string URL=' http://www。百度;HttpClient客户端=new HttpClient();字符串内容=客户端。GetStringAsync(url)。结果;控制台。WriteLine(内容);}以上是用HttpClient请求百度首页,操作起来好像挺方便的。运行输出请求的结果如下图: 所示。
控制台的输出是请求网址的内容。除了上面提到的GetStringAsync()方法,HttpClient还提供了以下Get方法。详情请参考msdn: 。
4.自定义请求头如果要自定义请求头,我们需要继承一个类: http客户端处理程序公共类githttpclienthandler : http客户端处理程序副本代码如下: { protected override tashttpresponsemessage senda。sync(HttpRequestMessage请求,cancelationtoken cancelationtoken){请求。headers . Referrer=new Uri(' http://www . Google.com/');请求。Headers.Add('UserAgent ',' Mozilla/4.0(兼容;MSIE 7.0Windows NT 6.1WOW64三叉戟/5.0;SLCC2。 NET CLR 2 . 0 . 50727)');taskshttpresponsemessage task=base。SendAsync(请求,取消令牌);HttpResponseMessage响应=任务。结果;MediaTypeHeaderValue content type=响应。内容。标题。内容类型;if(字符串。IsNullOrEmpty(contentType。CharSet)) { contentType。CharSet=' GBK ';}返回任务;} } HttpClientHandler是一种常见的代理模式,在HttpClient上增加了一层封装。GetStringAsync(),截取httpclient的输入输出,从而实现一些用户自定义的操作。这种模式在MVC中非常常见,是MVC中的过滤器。请求内容太长。HttpClient有一个属性MaxResponseContentBufferSize,表示读取相应的内容是字节缓存的最大数量。默认值为64K。当页面内容过大时,如果超过64K就会抛出异常HttpRequestException,导致Get失败。我们可以手动设置这个属性的大小:复制代码如下: HttpClient=New HttpClient(){ maxresponseccontent BufferSize=1024 * 1024 };如上对待。6.中文问题中文问题总是让人头疼,乱码也经常出现。上面提到的自定义请求头也可以处理,这里贴一段代码供参考。中文问题有点复杂,需要根据具体情况进行处理。复制代码的代码如下: httpresponse消息响应=task.resultMediaTypeHeaderValue content type=响应。内容。标题。内容类型;if(字符串。IsNullOrEmpty(contentType。CharSet)) { contentType。CharSet=' GBK ';}