Windows 8.1 之網絡
對于所有受支持的語言使用更簡單的 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。