设为首页 加入收藏

TOP

揭秘Windows10 UWP中的httpclient接口[2](一)
2017-10-11 16:06:56 】 浏览:5418
Tags:揭秘 Windows10 UWP httpclient 接口

阅读目录:

  1. 概述
  2. 如何选择
  3. System.Net.Http
  4. Windows.Web.Http
  5. HTTP的常用功能
  6. 修改http头部
  7. 设置超时
  8. 使用身份验证凭据
  9. 使用客户端证书
  10. cookie处理

概述

作为一个Universal Windows Platform (UWP)开发者,如果你尝试使用http与web服务或其他服务端通讯时,有多个API可以选择。 UWP中最常见并推荐使用的HTTP客户端API实现是System.Net.Http.HttpClient和Windows.Web.Http.HttpClient。 这些APIs相比旧的应该优先使用,比如旧APIs的WebClient和HttpWebRequest(尽管它的子集在UWP中是向后兼容的)。

我们收到一些关于问题反馈,关于这些APIs不同之处,从功能上来说两组APIs是上相等的,那在不同场景下选择哪一个呢,诸如此类的问题。 在这篇文章中,我们会去尝试定位这些问题,理清楚这两组APIs的用途及使用场景。

第一个推荐AIP是System.Net.Http.HttpClient,它在Net 4.5中第一次出现,通过Nuget可以安装这个API的兼容版本,这样就可以在Net 4.0和windows Phone 8 Silverlight apps中使用。相比旧的HttpWebRequest API,这个API的目标是提供一个简单的,干净的抽象层,比较灵活的实现http客户端功能。 比如,它允许链接自定义处理器,开发者可以拦截每个request和response,去实现自定义逻辑。 在windows8.1之后,所有功能都在.NET下面实现。 在windows10 UWP中这个API实现移到Windows.Web.Http和WinINet Http层上。

另外一个推荐API是Windows.Web.Http.HttpClient,这个API是Windows 8.1时开始引进的,在Windows Phone 8.1也是可以使用的。 增加这个API的主要目是,把不同windows应用开发语言(C#, VB, C++, java script)下,不同Http APIs合成一个,它支持上述APIs的所有特性。 大多数基础API都是从System.Net.Http派生的,在Windows HTTP基础上实现。

在Windows商店APP中使用这些API时,其支持的系统版本和程序语言如下所示:

如何选择

在UWP中这些HTTP API都是可以使用的,对于开发者来说最大的问题是在APP中应该使用哪一个。其答案取决去几个因素:

  • 是否需要结合本地UI收集用户证书,控制HTTP缓存读和写,或者通过指定的ssl客户端证书去做认证? 如果需要认证,那是应使用Windows.Web.Http.HttpClient。在现在的UWP中,Windows.Web.Http提供HTTP设置,它比System.Net.Http API更好的控制这些。 在未来的版本,也会加强支持System.Net.Http在UWP中的特性。

  • 是否考虑写跨平台的.NET代码(跨UWP/ASP.NET 5/IOS和Android)? 如果需要,那使用System.Net.Http API。它可以让你写的代码复用在其他.Net平台上,比如ASP.Net 5和.NET桌面平台应用。 通过使用Xamarin,这些API在IOS和Android中也得到支持。

现在就比较好理解为什么会有两个相似APIs了,也了解怎么在二者之间进行选择,下面进一步了解这两个对象模型。

System.Net.Http

其HttpClient对象是最顶端的抽象模型,在HTTP协议client-server模型中它表示client这部分。其client能发出多个request请求(用HttpRequestMessage表示)到服务端上,从服务端接收响应(用HttpResponseMessage表示)。用HttpContent基类和它派生出的类,表示对象body和每个request或response的content头部,比如StreamContent,MultipartContent和StringContent。它们表示各种http实体body内容。这些类都会提供ReadAs开头的一组方法,它能从请求或响应实体body中,以字符串形式、字节数组、流形式读取内容。

每一个HttpClient对象下都有一个处理者对象,它表示client下所有与HTTP相关的配置。从概念上来说,可以认为它是client部分下HTTP协议栈的代表。在客户端发送HTTP请求到服务端和传输数据到客户端上,它是非常可靠的。

在System.Net.Http API中默认处理者是HttpClientHandler。当你创建HttpClient对象实例时,会使用默认HTTP stack设置,自动帮你创建一个HttpClientHandler。如果你想修改默认一些设置,比如缓存行为,自动压缩,证书或代理,可以直接创建一个HttpClientHandler实例,修改它的属性,把它当做HttpClient构造函数的参数传入。这样HttpClient对象就会使用我们自定义的处理器,如下:

HttpClientHandler myHandler = new HttpClientHandler(); 
myHandler.AllowAutoRedirect = false;
HttpClient myClient = new HttpClient(myHandler);

链式处理器

System.Net.Http.HttpClient API设计中一个重要优势是:能够插入自定义处理器、在HttpClient对象下创建一连串的处理器。例如:构建一个app,它从web服务中请求一些数据。这时就可以自定义逻辑去处理HTTP服务端响应的4xx (客户端错误)和5xx (服务端错误),使用具体的重试步骤,比如尝试不同的端口请求或添加一个用户认证。 还可能会想从业务逻辑部分分离出HTTP相关的工作,它只关心web服务的数据返回。

这就可以使用自定义处理器类来完成,它从DelegatingHandler派生出,例如CustomHandler1,然后创建一个新实例,把它传入HttpClient构造函数。 DelegatingHandler类的InnerHandler属性被用指定下一个处理器,比如,可以添加个新的自定处理器(例CustomHandler2)到处理链上。处理链上最后一个处理者的InnerHandler,可以设置成HttpClientHandler的实例,它将传递请求到系统的HTTP协议栈上。 从概念上来看如下图:

下面是完成这部分的例子代码:

public class CustomHandler1 : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Debug.WriteLine("Processing request i
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇07.移动先行之谁主沉浮----控件之.. 下一篇Win10 FaceAPI小demo开发问题汇总

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目