Windows 8.1 之網(wǎng)絡(luò)
對(duì)于所有受支持的語(yǔ)言使用更簡(jiǎn)單的 HTTP 實(shí)現(xiàn),更方便的應(yīng)用通信,面向基于位置的移動(dòng)方案而且用于開(kāi)發(fā)通用連接應(yīng)用的新 API。
Windows 8.1 Preview 中的新特性或更新
- 新的 HTTP 客戶(hù)端 API
- 自定義 HTTP 請(qǐng)求篩選器
- 后臺(tái)傳輸更新
- 實(shí)時(shí)通信更新
- 連接待機(jī)更新
- Geofence 支持
- 直接 Wi-Fi
新的 HTTP 客戶(hù)端 API
Windows 8.1 Preview 中引入了 Windows.Web.Http, 即用于連接到 HTTP 的 Windows 應(yīng)用和代表性狀態(tài)傳輸 (REST) Web 服務(wù)的 Windows 運(yùn)行時(shí)命名空間。 這個(gè)新 API 在所有支持語(yǔ)言中提供了對(duì) Windows 8 所有功能的支持,并替代了最初為 Windows 8 發(fā)布的 HTTP API。
對(duì)于基本的請(qǐng)求操作,新 API 有一個(gè)簡(jiǎn)單的接口來(lái)處理最常見(jiàn)的任務(wù),并為身份驗(yàn)證 (AUTH) 提供了適用于大多數(shù)方案的合理的默認(rèn)設(shè)置。對(duì)于較為復(fù)雜的 HTTP 操作,更多的功能包括:
- 執(zhí)行常見(jiàn)操作(DELETE、GET、PUT 和 POST)的方法
- 支持常見(jiàn)的身份驗(yàn)證設(shè)置和模式
- 訪(fǎng)問(wèn)有關(guān)傳輸?shù)陌踩捉幼謱?(SSL) 詳細(xì)信息
- 在高級(jí)應(yīng)用中包含自定義篩選器的功能
- 獲取、設(shè)置和刪除 Cookie 的功能
- 異步方法上提供的 HTTP 請(qǐng)求進(jìn)度信息
Windows.Web.Http.Headers 命名空間支持創(chuàng)建 HTTP 標(biāo)頭和 Cookie,然后再將生成的 HTTP 標(biāo)頭和 Cookie 作為屬性與 HttpRequestMessage 和 HttpResponseMessage 對(duì)象相關(guān)聯(lián)。
以下示例代碼顯示了如何使用新的 API 創(chuàng)建一個(gè)基本的 HTTP GET 請(qǐng)求,進(jìn)而通過(guò)新的 API 以字符串的形式獲得 Web 服務(wù)器的內(nèi)容。
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 請(qǐng)求篩選器
通過(guò)受新 Windows.Web.Http.Filters 命名空間支持的 Web 請(qǐng)求篩選器模型,生成適用于以下特定連接和安全方案的 Web 請(qǐng)求將更加簡(jiǎn)單:
- 處理身份驗(yàn)證
- 在按流量計(jì)費(fèi)的網(wǎng)絡(luò)上限制訪(fǎng)問(wèn)
- 支持現(xiàn)代化編程技術(shù),如 mocking
- 連接失敗后自動(dòng)重試
通常情況下,處理請(qǐng)求期間預(yù)期可能會(huì)出現(xiàn)的一個(gè)網(wǎng)絡(luò)或安全狀況很容易,但要處理多個(gè)網(wǎng)絡(luò)或安全狀況可能就比較困難。 你可以使用這個(gè)新 API 來(lái)創(chuàng)建一些簡(jiǎn)單的篩選器,然后再根據(jù)需要將它們鏈接起來(lái)。這樣你就能夠針對(duì)預(yù)期可能會(huì)出現(xiàn)的復(fù)雜情況開(kāi)發(fā)出一些 Web 請(qǐng)求功能,而無(wú)需開(kāi)發(fā)非常復(fù)雜的程序。
HttpClient 是用于通過(guò) HTTP 發(fā)送和接收請(qǐng)求的主類(lèi)。 它使用 HttpBaseProtocolFilter 類(lèi)來(lái)確定如何發(fā)送和接收數(shù)據(jù)。所以 HttpBaseProtocolFilter 在邏輯上是所有自定義篩選器鏈的結(jié)尾。每個(gè) HttpClient 實(shí)例都可以有一個(gè)不同的篩選器鏈或管道,如下所示。
若要編寫(xiě)一個(gè)自定義篩選器,你需要?jiǎng)?chuàng)建一個(gè)自定義版本的 IHttpFilter 接口。使用 IHttpFilter.SendRequestAsync 方法來(lái)指定篩選器的工作方式。你可以使用 C#(或 Visual Basic .NET)或 C++ 來(lái)編寫(xiě)篩選器。這些篩選器可以在 Windows 運(yùn)行時(shí)支持的所有語(yǔ)言中調(diào)用和使用。
#p#
以下是向 HTTP 請(qǐng)求和響應(yīng)添加自定義標(biāo)頭的篩選器的示例代碼。
- 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);
- }
- }
若要使用這個(gè)篩選器,請(qǐng)?jiān)趧?chuàng)建新 HttpClient 對(duì)象時(shí)將其接口傳遞到 HttpClient(IHttpFilter) 構(gòu)造函數(shù)。若要設(shè)置一個(gè)篩選器鏈,請(qǐng)將新篩選器鏈接到之前的篩選器以及位于結(jié)尾處的 HttpBaseProtocolFilter 對(duì)象。
以下示例代碼顯示如何使用自定義篩選器創(chuàng)建一個(gè) HttpClient 對(duì)象。
- 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);
- }
后臺(tái)傳輸更新
Windows 8.1 Preview 中引入了對(duì) Windows.Networking.BackgroundTransfer 的更新,進(jìn)一步為開(kāi)發(fā)者簡(jiǎn)化了下載和上載文件的過(guò)程,從而增強(qiáng)了最終用戶(hù)的體驗(yàn)。
- 新的 BackgroundTransferGroup 類(lèi)可簡(jiǎn)化你的應(yīng)用創(chuàng)建這些組的過(guò)程,還能簡(jiǎn)化以并行、串行或基于優(yōu)先級(jí)的方式完成下載和上載的過(guò)程。例如,當(dāng)用戶(hù)決定下載并觀看某個(gè)執(zhí)播電視連續(xù)劇中的劇集時(shí),你的應(yīng)用現(xiàn)在可以?xún)?yōu)先下載連續(xù)劇中最早的劇集,或者讓用戶(hù)選擇先下載哪個(gè)劇集。
- 你的應(yīng)用現(xiàn)在可以更新其動(dòng)態(tài)磁貼或使用 toast 通知為用戶(hù)提供狀態(tài)信息。你可以使用 BackgroundDownloader 和 BackgroundUploader 類(lèi)中的新方法來(lái)配置這些通知。
- 如果下載可以在中斷后繼續(xù),并且持續(xù)時(shí)間可能超過(guò)兩分鐘,則后臺(tái)傳輸功能現(xiàn)在可以自動(dòng)將下載切換到***網(wǎng)絡(luò)(例如,不受限制的網(wǎng)絡(luò))。
對(duì)連接待機(jī)方案的實(shí)時(shí)通信支持
后臺(tái)網(wǎng)絡(luò)現(xiàn)在允許 Windows 鎖屏界面上的應(yīng)用接收網(wǎng)絡(luò)數(shù)據(jù)包,即使由于設(shè)備處于低能耗狀態(tài)(如連接待機(jī))導(dǎo)致應(yīng)用不再運(yùn)行時(shí)也是如此。更新包括:
- 對(duì)新 Windows.Web.Http API 的實(shí)時(shí)通信支持。
- 支持免打擾時(shí)間,這是 Windows 8.1 Preview 中的一項(xiàng)新增功能。
- IP 語(yǔ)音 (VoIP) 應(yīng)用的新通知功能,允許這些應(yīng)用在鎖屏?xí)r也能接聽(tīng)電話(huà)。
- 四個(gè)硬件插槽支持大多數(shù)網(wǎng)絡(luò)設(shè)備上的連接待機(jī)。
連接待機(jī)更新
連接待機(jī)是 Windows 設(shè)備所具備的一種特殊電源狀態(tài)。它允許應(yīng)用在設(shè)備屏幕關(guān)閉,以及設(shè)備處于待機(jī)(低能耗)狀態(tài)時(shí)執(zhí)行有限的連接任務(wù)。實(shí)時(shí)通信和后臺(tái)網(wǎng)絡(luò)僅在設(shè)備的網(wǎng)絡(luò)適配器支持時(shí)才使用連接待機(jī)功能。
Windows 8.1 Preview 中引入了這些連接待機(jī)更新,以便你的應(yīng)用可以提供可在設(shè)備的整個(gè)生命周期內(nèi)均能予以響應(yīng)的連接體驗(yàn)。
- 支持以太網(wǎng)和移動(dòng)寬帶網(wǎng)絡(luò)適配器
- 支持為網(wǎng)絡(luò)適配器提供的更多硬件插槽(更多插槽意味著鎖屏界面上有更多的應(yīng)用能夠使用連接待機(jī))
Geofence 支持
Windows 8.1 Preview 中引入了對(duì)“地理圍欄”的支持。 地理圍欄允許應(yīng)用以某個(gè)感興趣的地理位置為圓點(diǎn)定義一個(gè)范圍,并讓系統(tǒng)在運(yùn)行應(yīng)用的設(shè)備進(jìn)入或退出這個(gè)區(qū)域時(shí)向應(yīng)用發(fā)出警報(bào)。有了這個(gè)對(duì) Windows 地理功能的更新,你的應(yīng)用可以在好友位于附近時(shí)通知用戶(hù),向離開(kāi)單位或離開(kāi)家的用戶(hù)發(fā)送提醒,或在用戶(hù)位于某些商店附近時(shí)顯示優(yōu)惠券。
通過(guò) Windows 8.1 Preview 中的地理圍欄功能,你可以完成以下操作:
- 創(chuàng)建或刪除一個(gè)或多個(gè)“地理圍欄”或感興趣的區(qū)域
- 設(shè)置通知,以便在進(jìn)入或離開(kāi)某個(gè)地理圍欄時(shí)進(jìn)行通知。
- 通過(guò)使用新的后臺(tái)任務(wù) LocationTrigger 類(lèi)允許你的地理圍欄應(yīng)用在后臺(tái)運(yùn)行,并繼續(xù)獲取地理圍欄事件。
- 允許你的應(yīng)用在位于鎖屏界面上時(shí)接收地理圍欄更新。
Windows.Devices.Geolocation.Geofencing 命名空間中包含在使用地理圍欄功能時(shí)所需的類(lèi)??傮w來(lái)說(shuō)就是,你可以創(chuàng)建一個(gè)或多個(gè)定義感興趣區(qū)域和通知條件的 Geofence 對(duì)象。然后你的應(yīng)用必須處理設(shè)備進(jìn)入或退出其中一個(gè)所定義的區(qū)域時(shí)發(fā)生的事件。 你可以之后對(duì)應(yīng)用進(jìn)行測(cè)試,方法是使用仿真程序來(lái)模擬設(shè)備進(jìn)入和退出地理圍欄時(shí)的運(yùn)動(dòng)。
Wi-Fi Direct 支持
你可以使用新的 WiFiDirectDevice 類(lèi)來(lái)枚舉無(wú)線(xiàn)范圍內(nèi)的 WiFi Direct 設(shè)備列表。 可以使用你的用戶(hù)設(shè)置的“設(shè)備”部分中的“添加設(shè)備”功能將這些設(shè)備與你的電腦相關(guān)聯(lián)。然后,你的應(yīng)用就可以創(chuàng)建與范圍內(nèi)的任何 Wi-Fi Direct 設(shè)備的網(wǎng)絡(luò)套接字連接。Wi-Fi Direct 是一種使用與 Wi-Fi 相同范圍的高帶寬傳輸。 如果能使用多媒體共享或高性能的連接游戲,將是一種非常卓越的享受。有關(guān)詳細(xì)信息,請(qǐng)參閱 Windows 運(yùn)行時(shí) API 中的 Windows.Devices.WifiDirect 命名空間。
Note 你必須在應(yīng)用部件清單文件中啟用鄰近感應(yīng)功能,才能使用 Wi-Fi Direct API。