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连接(也就是通常所说的长连接)来优化。