System.Net.Http.HttpClient 和 Windows.Web.Http.HttpClient 的不同
最近在做uwp开发的时候,发现在许多网络请求用的都是 Windows.Web.Http.HttpClient。而之前在做HttpClient请求的时候,一直用的是 System.Net.Http.HttpClient这个命名空间,但是而且两个不兼容,如果引入了一个,再引入另一个,就会报错。那么问题来了:
System.Net.Http.HttpClient 和 Windows.Web.Http.HttpClient 的不同究竟是什么呢?
查了查MSDN,上面是这么写的:
Note:The System.Net.Http and System.Net.Http.Headers namespace might not be available in future versions of Windows for use by Windows Store apps. Starting with Windows 8.1 and Windows Server 2012 R2, use Windows.Web.Http.HttpClient in the Windows.Web.Http namespace and the related Windows.Web.Http.Headers and Windows.Web.Http.Filters namespaces instead for Windows Runtime apps.
这段话的大概意思就是,System.Net.Http.HttpClient 在未来将不再支持Windows商店应用,而Windows.Web.Http.HttpClient 更适合在uwp开发中使用!建议大家就用 Windows.Web.Http.HttpClient这个命名空间! 微软都这么建议了,看来我得改一下使用习惯了。以后uwp开发用 Windows.Web.Http.HttpClient。
但是问题又来了,微软为什么要这么做呢?(说实话,自从wp8开始,api换就没停。跟着微软混,真心累)所以我得弄清
为什么要使用Windows.Web.Http.HttpClient?它好在哪里?
经过查询国外大牛的博客和资料,我总结了一下:
1、区别:System.Net.Http 支持 Windows8或者.Net 4.5 ,而Windows.Web.Http 支持Windows 8.1 或者Windows8.1以上的版本。Windows.Web.Http是WinRT API,支持所有的winRT 应用,重要的是它支持C#、VB,C++、JavaScript等等,这样更加统一,而System.Net.Http 只是一个.NET API,而且它只适合C#和VB。
查了查英文资料,总结如下
Windows.Web.Http 的特点:
1、 属于WinRT API,由于是用native code写的, 所以在性能表现方面更加出色。
2、Windows.Web.Http 更通用,在与其他Windows 组件进行一些交互时,System.Net.Http 会遇到许多问题和阻碍,说白了就是局限性太大。
3、Windows.Web.Http 由于是WinRT 类型,所以将会更加统一,例如IInputStream, IOutputStream and IBuffer,在使用这些接口时,更加简单,避免了在.Net中要将System.IO.Stream转化成IInputStream或者IOutputStream。而且,在一些情况下,如果用Windows.Storage.Streams.IBuffer还可能提高应用的性能。
4、Windows.Web.Http有一些新特性,比如HTTP/2 的支持。
注意:Windows.Web.Http 使用HttpClient是不能像System.Net.Http中的HttpClient那样设置请求超时时间的,根本没用TimeOut这个属性。。。好吧,不知道微软这样做的原因是什么,是想让系统自己去管理吗?网上查了查,如果用Windows.Web.Http的HttpClient,需要自定义超时,通过删除Token的方式:
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(30));
var httpClient = new HttpClient();
var resourceUri = new Uri("http://www.contoso.com");
try {
HttpResponseMessage response = await httpClient.GetAsync(resourceUri, cts.Token);
} catch (TaskCanceledException ex)
大概就是这么多,也就是说,以后uwp中,尽量用Windows.Web.Http吧!欢迎喜欢uwp开发的大神或者同学们加入开发群:193148992。大家共同学习!
网友评论