首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WP7检查互联网是否可用

WP7检查互联网是否可用
EN

Stack Overflow用户
提问于 2010-12-07 23:39:04
回答 4查看 3.1K关注 0票数 5

我的应用程序WP7未被接受,因为如果互联网不可用,它将无法加载。我寻找了一种方法来检查它,并找到了这个命令

NetworkInterface.GetIsNetworkAvailable()

但它在模拟器上不起作用,我也没有任何设备来测试它。谁能告诉我,如果设备处于飞行模式,是否返回false?如果不是,我如何检查它?

谢谢,奥斯卡

编辑:我也尝试过这段代码:

代码语言:javascript
复制
try
{
    wsClient.CurrenciesCompleted += new EventHandler<CurrencyConversion.CurrenciesCompletedEventArgs>(wsClient_CurrenciesCompleted);
    wsClient.CurrenciesAsync(null);
}
catch
{
     NetworkNotAvailable();
}

但是我没能捕捉到异常,我在wsClient_CurrenciesCompleted方法里也试过了,但也不好。

我可以在哪里测试它?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-07 23:40:07

不要测试“一般的互联网”--测试你实际要连接的服务。通过尝试连接它来测试它-在启动时发出一些简单的、非破坏性的请求。是的,这将占用用户数据容许量的一小部分,但是:

  • 您将预热网络堆栈,并建立一个最终应自动保持活动状态的连接,以便减少未来的延迟。
  • 您可以警告用户,如果连接失败,他们的功能可能会受到限制。
票数 6
EN

Stack Overflow用户

发布于 2010-12-08 02:27:52

Jon建议的另一种方法是检查哪个网络接口可用。在需要根据网络速度调整调用哪个服务的情况下,这非常方便。例如,可以修改下面的switch语句,以返回一个Enum来表示网络的质量。

代码语言:javascript
复制
public class NetworkMonitorClass 
{
   private Timer timer;
   private NetworkInterfaceType _currNetType = null; 
   private volatile bool _valueRetrieved = false;

   public NetworkMonitorClass()
   {
       //using a timer to poll the network type.
       timer = new Timer(new TimerCallBack((o)=>
       {
           //Copied comment from Microsoft Example:
           //  Checking the network type is not instantaneous
           //  so it is advised to always do it on a background thread.
           _currNetType = Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType;
           _valueRetrieved = true;
       }), null, 200, 3000); // update the network type every 3 seconds.
   }

   public NetworkInterfaceType CurrentNetworkType 
   { 
       get
       {  
           if(false == _valueRetrieved ) return NetworkInterfaceType.Unknown;  
           return _currNetType; 
       } 
       private set { ;} 
   }

   public bool isNetworkReady()
   {
       if(false == _valueRetrieved ) return false;

       switch (_currentNetworkType)
       {
          //Low speed networks
          case NetworkInterfaceType.MobileBroadbandCdma:
          case NetworkInterfaceType.MobileBroadbandGsm:
            return true;
          //High speed networks
          case NetworkInterfaceType.Wireless80211:
          case NetworkInterfaceType.Ethernet:
            return true;
          //No Network
          case NetworkInterfaceType.None:
          default:
             return false;
      } 
   }
}

请参阅http://msdn.microsoft.com/en-us/library/microsoft.phone.net.networkinformation.networkinterface.networkinterfacetype(VS.92).aspx

票数 3
EN

Stack Overflow用户

发布于 2010-12-08 00:11:57

在模拟器中,GetIsNetworkAvailable()将始终返回true。为了在模拟器中进行测试,您需要在代码中解决这个问题。

这可能是一个有用的快速检查,但您也(正如Jon指出的)需要处理无法连接到特定服务器的情况。

当您尝试在回调中获取响应时,可以通过捕获WebException来处理此问题。

代码语言:javascript
复制
private static void DownloadInfoCallback(IAsyncResult asynchronousResult)
{
    try
    {
        var webRequest = (HttpWebRequest)asynchronousResult.AsyncState;

        // This will cause an error if the request failed
        var webResponse = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);

        .....
    }
    catch (WebException exc)
    {
        // Handle error here
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4378456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档