HttpClient简单介绍及可优化的点

1 描述

HttpClient是.Net 4.5中增加了一个新的System.Net.Http.HttpClient名字空间(在 System.Net.Http.dll 中),用于发送 HTTP 请求和接收 HTTP 响应。当访问第三方Api,Web Service等时可能会使用。

2 简单使用

HttpClient使用简洁,以前只有java有,使用起来也类似

string uri = "http://www.aliang.space/";
HttpClient client = new HttpClient();
string body = await client.GetStringAsync(uri);

除GetStringAsync()之外,还有GetByteArrayAsync()、GetStreamAsync()、PostAsync ()、DeleteAsync()等函数,非常好用。

其中HttpClient.GetStringAsync()是一个简化的函数,用这个函数的时候,我们看不到HttpResponse的相关信息,如果需要看到Http响应的信息,可以用如下标准方式:

HttpResponseMessage response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();

3 自定义HttpHeader

有时我们需要在发送Get请求时在HttpHeader中加入一些额外的信息,常见的的有Refer、Cookie及UserAgent等。这个时候我们就要用到HttpClientHandler了,具体方法如下:

//自定义一个HttpClienHanlder类,重载SendAsync方法
string uri = "http://www.aliang.space/";
HttpClient client = new HttpClient();

class MyHttpClienHanlder: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)");

        return base.SendAsync(request, cancellationToken);
    }
}
//在HttpClient构造函数中加入自定义的HttpClienHanlder类
string uri = "http://www.windows.com/";
HttpClient client = new HttpClient(new MyHttpClienHanlder());
string body = await client.GetStringAsync(uri);

HttpClienHanlder其实就是是一个常见的代理模式的设计,它在HttpClient.GetStringAsync()中加了一层封装,拦截了HttpClient的输入和输出,从而实现一些自定义的操作。

4 可优化的点

HttpClient在第一次调用时存在某种类似EF的预热机制,所以每次请求时都要经历新建TCP连接->传数据->关闭连接(也就是通常所说的短连接),可以通过重用TCP连接(也就是通常所说的长连接)来优化。