如何管理网络连接事件和可用性更改 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

本主题显示了如何使用 Windows.Networking.Connectivity 命名空间中的类注册以接收关于网络连接状态更改的通知并检索当前状态信息。

还提供将支持在网络方案中提供一致用户体验的应用行为建议。

先决条件

以下示例使用 JavaScript,且基于网络信息示例。 有关创建使用 JavaScript 的 Windows 运行时应用的常规帮助,请参阅创建第一个使用 JavaScript 的 Windows 运行时应用

了解什么是 ConnectionProfile,以及如何访问它表示的信息的重要性;有关详细信息,请参阅如何检索网络连接信息。 有关其他代码示例,请下载网络信息示例

什么是连接状态更改事件?

状态更改事件指示单个连接所提供的可用性、类型或连接成本发生的变化。最新的联网应用经常遇到穿过多个网络方案,这是移动设备的使用中非常典型的情况。 当 Windows 运行时检测到新网络时,它会自动将其提供为新的连接选项。例如,如果用户正在使用设备在 3G/4G 网络上传输数据流,之后又进入一个 Wi-Fi 网络范围,则对于要利用的应用程序来说,这个新连接选项将成为可用选项。当然,这也意味着,用户可以通过移动来脱离一个当前甚至在使用中的网络的范围。

考虑到所有这些可能性,很有必要使你的应用具备这样的逻辑,即允许在网络可用性发生变化时,做出明智的选择。现有的网络连接不会自动无缝切换到其他连接。你的应用需要注册 networkstatuschanged 事件并根据情况进行调整。

注册以获取连接状态更改事件的通知

在你的应用能够自我调整以适应不断变化的网络状态之前,它需要知道这些变化何时会发生。 以下示例代码显示了如何针对特定的连接配置文件注册 networkstatuschanged 的事件通知。

当你调用大部分异步网络方法时,必须编写代码以处理异常。同样,Windows.Networking.Connectivity 命名空间中注册事件通知或尝试检索 ConnectionProfile 的方法可能引发异常。异常处理程序可以检索关于异常原因的更详细的信息,以更好地了解此次失败,并作出适当的判定。有关详细信息,请参阅如何处理网络应用中的异常


// Define some variables used

// A variable to store network status change information
var internetProfileInfo = "";

// A  boolean to keep track of registration for network status change notifications
var registeredNetworkStatusNotif = false;

var networkInfo = Windows.Networking.Connectivity.NetworkInformation;

//Register for Network Status Change notifications, and display new Internet Connection Profile information on network status change
function registerForNetworkStatusChangeNotif() {

    // register for network status change notifications
    if (!registeredNetworkStatusNotif) {
        try {
            networkInfo.addEventListener("networkstatuschanged", onNetworkStatusChange);
            registeredNetworkStatusNotif = true;

            if (internetProfileInfo === "") {
                mySample.displayStatus("No network status change. ", "sample", "status");
        }
        catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message);
        }
    }
}

当网络方案更改时,你的应用可能需要取消注册网络状态更改通知(如果已注册),然后重新注册关于新的网络方案的通知。

//Unregister for Network Status Change notifications
function unRegisterForNetworkStatusChangeNotif() {
    try {
        networkInfo.removeEventListener("networkstatuschanged", onNetworkStatusChange);
        internetProfileInfo = "";
    }
    catch (e) {
        mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

检索连接状态更改信息

发送状态更改时,以下关于事件处理程序的示例将检索相关联的 ConnectionProfile,以查找当前 Internet 连接配置文件。该 ConnectionProfile 可用于检索和显示连接状态信息,其中包括当前作用域、类型和连接成本,它们由 NetworkConnectivityLevelNetworkTypesNetworkCostType 定义。

// Event handler for Network Status Change event
function onNetworkStatusChange(sender) {

    //network status changed
    internetProfileInfo = "Network Status Changed: \n\r";

    try {
        // get the ConnectionProfile that is currently used to connect to the Internet
        var internetProfile = networkInfo.getInternetConnectionProfile();
        if (internetProfile === null) {
            mySample.displayStatus("Not connected to Internet\n\r");
        }
        else {
            internetProfileInfo += getConnectionProfileInfo(internetProfile) + "\n\r";
            mySample.displayStatus(internetProfileInfo);
        }
        internetProfileInfo = "";
    }
    catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

存在各种网络状态,更改这些状态会导致网络状态更改事件。这包括设备是否有新的 ConnectionProfile、新连接成本、连接级别以及其他更改。 以上事件处理程序可使用 NetworkStateChangeEventDetails 类确定更改的内容。

在处理连接状态更改时建议的应用行为

下表概述了主要的连接状态更改方案并提供应用行为建议:

方案 推荐的行为
由于错误造成的连接中断

只需通过重试网络操作即可重新建立连接。如果失败,则等待 networkstatuschanged 事件检索当前连接状态信息。我们建议应用在两次重试之间使用成倍增长的回退间隔,其值从 50 毫秒开始增长。

网络中断

通知用户连接已中断,然后注册并等待 networkstatuschanged 事件。

新网络可用性

随着移动设备的出现,涉及跨越多个公用网络和专用网络的单台设备的方案越来越常见。 例如,在回家并连接到无限制的家庭网络之前,用户可能连接到移动宽带并使用 Messaging 应用与朋友聊天。Windows 8、Windows Server 2012 以及 Windows Phone 8.1 和更高版本中的默认策略是:无限制的网络优先于按流量计费的网络;速度较快的网络优先于较慢的网络。但是,由应用建立的现有连接不会自动转换到新网络。必须涉及应用,因为只有应用才能针对是否转换到新网络作出最佳判定。

如果视频流即将下载完毕,那么切换到新网络并重新开始下载可能没有什么意义。但是,如果当前网络遗漏程序包、速度太慢或者需要额外时间才能完成流,那么切换到新网络可能是最佳做法。

如果你确定可以为应用方案切换网络,那么在检测新网络时需要遵循以下指南:

1. 如果提供更好的连接,请检查网络成本并重试网络操作。Windows 自动选择网络的策略是:无限制的网络优先于按流量计费的网络;速度较快的网络优先于较慢的网络。

2. 重试时,如果网络操作成功,则取消之前网络上的原始网络操作(如果存在)。

网络成本变化

尤其是移动网络,通常会对使用量施加非常具体的限制。如果应用遇到由于使用了超过 80% 的移动宽带数据上限、可变成本或漫游导致的网络成本的更改,则按照如何管理按流量计费的网络成本约束中的详细说明调整应用行为。

 

注意  高级开发人员也可以选择在重试网络操作时优化应用的行为。例如,你可能会用更高速度网络上的新连接取代现有的连接。在此方案中,开发人员可以使用套接字 API(如 StreamSocketInformation.bandwidthStatistics),以确定切换到另一个连接是否正确。

 

摘要

在本主题中,我们了解了如何注册连接状态更改通知,并使用这些通知从发生该事件的 ConnectionProfile 中检索当前状态信息。我们还查看了在处理最常见的状态更改方案时的推荐应用行为。

尽管本主题介绍了网络可用性,但在涉及连接到按流量计费的网络的方案中,networkstatuschanged 事件还表示成本和数据计划属性的更改。有关在这些情况下如何以最佳方式更改应用行为的详细信息和指南,请参阅如何管理按流量计费的网络成本约束

相关主题

其他

创建第一个采用 JavaScript 的 Windows 运行时应用

如何处理网络应用中的异常

如何管理按流量计费的网络成本约束

如何检索网络适配器和区域信息

如何检索网络连接信息

如何检索网络连接使用情况数据

参考

ConnectionProfile

NetworkInformation

networkstatuschanged

networkStatusChangedEventHandler

Windows.Networking.Connectivity

示例

网络信息示例

网络状态背景示例