在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的System.Net.Http.dll类库。这一切都大大简化了(甚至能够说是革命性得改变了)传统.NET HTTP操做处理的方式。api
相比最新的模型,以前.NET 4.0和C# 4.0的时代的HTTP处理方式就显得弱爆了。服务器
首先,若是写成一异步的话。会创造一大堆难看的APM异步执行方法。若是用Lambda的话,就得嵌套多层,也会看着不爽。异步
其次,关于HTTP特有的,就是用户必须手动把URL参数编码而且正确链接而后放入到HTTP请求中。而.NET 4.5中的HttpContent类型的多个派生类型能够支持更快捷的HTTP数据内容建立,咱们可使用FormUrlEncodedContent来完成上述需求。async
还有就是自动解压缩HTTP回应中的GZIP的问题:.NET 4.0中在HttpWebRequest的AutomaticDecompression属性中,在.NET 4.5中的HttpClient类型中,可使用HttpClientHandler的AutomaticDecompression属性,先后二者对应值都是DecompressionMethods枚举类型,这个类型在.NET 2.0就有了。所以命名空间在System.Net中。编码
咱们能够拿一个街旁网API来作演示,整个过程以下以下:url
1. 建立一个HTTP POST请求。spa
2. 服务器会返回GZip压缩后的数据。code
3. 读取并输出结果。orm
代码以下:对象
//C# 5.0+ / .NET 4.5+
//+ using System.Net;
//+ using System.Net.Http(需引用System.Net.Http.dll类库);
static void Main(string[] args)
{
doo();
System.Threading.Thread.Sleep(-1);
}
static async void doo()
{
//设置必要参数
//示例API能够参考:http://dev.jiepang.com/doc/get/users/show
var url = "http://api.jiepang.com/v1/users/show";
var userId = "633899402";
//设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//建立HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent作HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"id", userId},
{"force_gzip", "1"}
});
//await异步等待回应
var response = await http.PostAsync(url, content);
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,由于上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}
运行后,若是成功的话会输出包含用户信息的JSON!
注意:
貌似街旁网已经把这个API改为了了强制OAuth验证(虽然文档上还写着“不须要验证”)。因此运行结果不会输出帐户信息,而会输出有包含错误信息的JSON。不过无所谓了,正确输出HTTP回应GZip数据中的结果,就是咱们想要的。
注意能够经过HttpClient类型的EnsureSuccessStatusCode来确保HTTP回应返回状态成功,不然会抛出异常。
//确保HTTP成功状态值(response对应HttpResponseMessage对象)
response.EnsureSuccessStatusCode();
上述API使用了一个显示参数来指定须要返回GZIP数据回应,也能够经过设置HTTP请求的AcceptEncoding,以下,手动加入GZIP类型:
//+ System.Net.Http;
//+ System.Net.Http.Headers
//http是HttpClient对象
//也能够手动构建HttpRequestMessage,而后经过HttpClient.SendAsync来发送
http.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("GZIP"));
http是HttpClient对象,它的DefaultRequestHeaders返回HttpRequestHeaders对象。固然也能够手动构建HttpRequestMessage而后修改HttpRequestHeaders,而后经过HttpClient.SendAsync来发送。另外注意StringWithQualityHeaderValue类型在System.Net.Http.Headers命名空间内。