.Net 4.5中增加了一个新的System.Net.Http.HttpClient名字空间(在 System.Net.Http.dll 中),用于发送 HTTP 请求和接收 HTTP 响应。

基本操作

和以前的HttpWebRequest相比,HttpClient更加简洁,下面就是一个下载 class HtmlTextHandler : HttpClientHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);

var contentType = response.Content.Headers.ContentType;
contentType.CharSet = await getCharSetAsync(response.Content);

return response;
}

private async Task<string> getCharSetAsync(HttpContent httpContent)
{
var charset = httpContent.Headers.ContentType.CharSet;
if (!string.IsNullOrEmpty(charset))
return charset;

var content = await httpContent.ReadAsStringAsync();
var match = Regex.Match(content, @"charset=(?<charset>.+?)""", RegexOptions.IgnoreCase);
if (!match.Success)
return charset;

return match.Groups["charset"].Value;
}
}

.Net 4.5中的HttpClient试用-LMLPHP
  1. 响应内容过长导致HttpRequestException

HttpClient有一个属性MaxResponseContentBufferSize,它表示的是读取响应内容时最大字节数缓冲区。它的默认值是64k,当页面内容很多,超过64k的时候,就会抛出一个HttpRequestException,导致Get失败。

这个属性必须是个正整数,也就是说,它是不支持自适应的,这个非常令人费解,不知道MS为什么非要自己估算页面大小,在Get操作前支持为合适的值,这个是个不够好用的地方。

我查了一下MSDN,目前对这个属性的说明比较少,不知道更改这个值的大小会影响什么地方。即使把他设置成int.Max貌似也不会有过多的内存占用。不过为了安全起见,还是把它设置在一个合理的范围吧,像我一般就把它设置为1m。(PS: 在最新的.Net 4.5 RC中,这个值已经更新成了int.MaxValue,希望RTM版不要恢复成64k,确实不够用)

HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1024 * 1024 };

最后提一个不是问题的问题:HttpClient全部都是异步方法,没有同步方法,如果要在同步函数中使用,必须通过Task.Wait()来等待任务完成,稍稍有些不便。

05-11 20:03