对于所有受支持的语言使用更简单的 HTTP 实现,更方便的应用通信,面向基于位置的移动方案而且用于开发通用连接应用的新 API。
Windows 8.1 Preview 中的新特性或更新
- 新的 HTTP 客户端 API
- 自定义 HTTP 请求筛选器
- 后台传输更新
- 实时通信更新
- 连接待机更新
- Geofence 支持
- 直接 Wi-Fi
新的 HTTP 客户端 API
Windows 8.1 Preview 中引入了 Windows.Web.Http, 即用于连接到 HTTP 的 Windows 应用和代表性状态传输 (REST) Web 服务的 Windows 运行时命名空间。 这个新 API 在所有支持语言中提供了对 Windows 8 所有功能的支持,并替代了最初为 Windows 8 发布的 HTTP API。
对于基本的请求操作,新 API 有一个简单的接口来处理最常见的任务,并为身份验证 (AUTH) 提供了适用于大多数方案的合理的默认设置。对于较为复杂的 HTTP 操作,更多的功能包括:
- 执行常见操作(DELETE、GET、PUT 和 POST)的方法
- 支持常见的身份验证设置和模式
- 访问有关传输的安全套接字层 (SSL) 详细信息
- 在高级应用中包含自定义筛选器的功能
- 获取、设置和删除 Cookie 的功能
- 异步方法上提供的 HTTP 请求进度信息
Windows.Web.Http.Headers 命名空间支持创建 HTTP 标头和 Cookie,然后再将生成的 HTTP 标头和 Cookie 作为属性与 HttpRequestMessage 和 HttpResponseMessage 对象相关联。
以下示例代码显示了如何使用新的 API 创建一个基本的 HTTP GET 请求,进而通过新的 API 以字符串的形式获得 Web 服务器的内容。
JavaScript:
- var uri = new Uri("http://example.com/datalist.aspx");
- var httpClient = new HttpClient();
- // Always catch network exceptions for async methods.
- httpClient.GetStringAsync (uri).done(function () {
- // Get completed operation.
- }, onError);
- function onError(reason) {
- // Details in reason.Message and ex.HResult.
- }
C++:
- using namespace Windows::Foundation;
- using namespace Windows::Web::Http;
- uri = ref new Uri("http://example.com/datalist.aspx");
- httpClient = ref new HttpClient();
- // Always network exceptions for async methods.
- try
- {
- httpClient->GetStringAsync (uri);
- }
- catch
- {
- // Details in ex.Message and ex.HResult.
- }
C# :
- using System;
- using Windows.Foundation;
- using Windows.Web.Http;
- var uri = new Uri("http://example.com/datalist.aspx");
- var httpClient = new HttpClient();
- // Always catch network exceptions for async methods.
- try
- {
- var result = await httpClient.GetStringAsync (uri);
- }
- catch
- {
- // Details in ex.Message and ex.HResult.
- }
自定义 HTTP 请求筛选器
通过受新 Windows.Web.Http.Filters 命名空间支持的 Web 请求筛选器模型,生成适用于以下特定连接和安全方案的 Web 请求将更加简单:
- 处理身份验证
- 在按流量计费的网络上限制访问
- 支持现代化编程技术,如 mocking
- 连接失败后自动重试
通常情况下,处理请求期间预期可能会出现的一个网络或安全状况很容易,但要处理多个网络或安全状况可能就比较困难。 你可以使用这个新 API 来创建一些简单的筛选器,然后再根据需要将它们链接起来。这样你就能够针对预期可能会出现的复杂情况开发出一些 Web 请求功能,而无需开发非常复杂的程序。
HttpClient 是用于通过 HTTP 发送和接收请求的主类。 它使用 HttpBaseProtocolFilter 类来确定如何发送和接收数据。所以 HttpBaseProtocolFilter 在逻辑上是所有自定义筛选器链的结尾。每个 HttpClient 实例都可以有一个不同的筛选器链或管道,如下所示。
若要编写一个自定义筛选器,你需要创建一个自定义版本的 IHttpFilter 接口。使用 IHttpFilter.SendRequestAsync 方法来指定筛选器的工作方式。你可以使用 C#(或 Visual Basic .NET)或 C++ 来编写筛选器。这些筛选器可以在 Windows 运行时支持的所有语言中调用和使用。
#p#
以下是向 HTTP 请求和响应添加自定义标头的筛选器的示例代码。
- public class PlugInFilter : IHttpFilter {
- private IHttpFilter innerFilter;
- public PlugInFilter(IHttpFilter innerFilter) {
- if (innerFilter == null) {
- throw new ArgumentException("innerFilter cannot be null.");
- }
- this.innerFilter = innerFilter;
- }
- public IAsyncOperationWithProgress<HttpResponseMessage, HttpProgress> SendRequestAsync(HttpRequestMessage request) {
- return AsyncInfo.Run<HttpResponseMessage, HttpProgress>(async (cancellationToken, progress) =>
- {
- request.Headers.Add("Custom-Header", "CustomRequestValue");
- HttpResponseMessage response = await innerFilter.SendRequestAsync(request).AsTask(cancellationToken, progress);
- cancellationToken.ThrowIfCancellationRequested();
- response.Headers.Add("Custom-Header", "CustomResponseValue");
- return response;
- });
- }
- public void Dispose() {
- innerFilter.Dispose();
- GC.SuppressFinalize(this);
- }
- }
若要使用这个筛选器,请在创建新 HttpClient 对象时将其接口传递到 HttpClient(IHttpFilter) 构造函数。若要设置一个筛选器链,请将新筛选器链接到之前的筛选器以及位于结尾处的 HttpBaseProtocolFilter 对象。
以下示例代码显示如何使用自定义筛选器创建一个 HttpClient 对象。
- internal static void CreateHttpClient(ref HttpClient httpClient)
- {
- if (httpClient != null) {
- httpClient.Dispose();
- }
- // Extend HttpClient by chaining multiple filters together
- // and then providing HttpClient with the configured filter pipeline.
- var basefilter = new HttpBaseProtocolFilter();
- // Adds a custom header to every request and response message.
- var myfilter = new PlugInFilter(basefilter);
- httpClient = new HttpClient(myfilter);
- }
后台传输更新
Windows 8.1 Preview 中引入了对 Windows.Networking.BackgroundTransfer 的更新,进一步为开发者简化了下载和上载文件的过程,从而增强了最终用户的体验。
- 新的 BackgroundTransferGroup 类可简化你的应用创建这些组的过程,还能简化以并行、串行或基于优先级的方式完成下载和上载的过程。例如,当用户决定下载并观看某个执播电视连续剧中的剧集时,你的应用现在可以优先下载连续剧中最早的剧集,或者让用户选择先下载哪个剧集。
- 你的应用现在可以更新其动态磁贴或使用 toast 通知为用户提供状态信息。你可以使用 BackgroundDownloader 和 BackgroundUploader 类中的新方法来配置这些通知。
- 如果下载可以在中断后继续,并且持续时间可能超过两分钟,则后台传输功能现在可以自动将下载切换到***网络(例如,不受限制的网络)。
对连接待机方案的实时通信支持
后台网络现在允许 Windows 锁屏界面上的应用接收网络数据包,即使由于设备处于低能耗状态(如连接待机)导致应用不再运行时也是如此。更新包括:
- 对新 Windows.Web.Http API 的实时通信支持。
- 支持免打扰时间,这是 Windows 8.1 Preview 中的一项新增功能。
- IP 语音 (VoIP) 应用的新通知功能,允许这些应用在锁屏时也能接听电话。
- 四个硬件插槽支持大多数网络设备上的连接待机。
连接待机更新
连接待机是 Windows 设备所具备的一种特殊电源状态。它允许应用在设备屏幕关闭,以及设备处于待机(低能耗)状态时执行有限的连接任务。实时通信和后台网络仅在设备的网络适配器支持时才使用连接待机功能。
Windows 8.1 Preview 中引入了这些连接待机更新,以便你的应用可以提供可在设备的整个生命周期内均能予以响应的连接体验。
- 支持以太网和移动宽带网络适配器
- 支持为网络适配器提供的更多硬件插槽(更多插槽意味着锁屏界面上有更多的应用能够使用连接待机)
Geofence 支持
Windows 8.1 Preview 中引入了对“地理围栏”的支持。 地理围栏允许应用以某个感兴趣的地理位置为圆点定义一个范围,并让系统在运行应用的设备进入或退出这个区域时向应用发出警报。有了这个对 Windows 地理功能的更新,你的应用可以在好友位于附近时通知用户,向离开单位或离开家的用户发送提醒,或在用户位于某些商店附近时显示优惠券。
通过 Windows 8.1 Preview 中的地理围栏功能,你可以完成以下操作:
- 创建或删除一个或多个“地理围栏”或感兴趣的区域
- 设置通知,以便在进入或离开某个地理围栏时进行通知。
- 通过使用新的后台任务 LocationTrigger 类允许你的地理围栏应用在后台运行,并继续获取地理围栏事件。
- 允许你的应用在位于锁屏界面上时接收地理围栏更新。
Windows.Devices.Geolocation.Geofencing 命名空间中包含在使用地理围栏功能时所需的类。总体来说就是,你可以创建一个或多个定义感兴趣区域和通知条件的 Geofence 对象。然后你的应用必须处理设备进入或退出其中一个所定义的区域时发生的事件。 你可以之后对应用进行测试,方法是使用仿真程序来模拟设备进入和退出地理围栏时的运动。
Wi-Fi Direct 支持
你可以使用新的 WiFiDirectDevice 类来枚举无线范围内的 WiFi Direct 设备列表。 可以使用你的用户设置的“设备”部分中的“添加设备”功能将这些设备与你的电脑相关联。然后,你的应用就可以创建与范围内的任何 Wi-Fi Direct 设备的网络套接字连接。Wi-Fi Direct 是一种使用与 Wi-Fi 相同范围的高带宽传输。 如果能使用多媒体共享或高性能的连接游戏,将是一种非常卓越的享受。有关详细信息,请参阅 Windows 运行时 API 中的 Windows.Devices.WifiDirect 命名空间。
Note 你必须在应用部件清单文件中启用邻近感应功能,才能使用 Wi-Fi Direct API。