Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight WP7检查互联网是否可用_Silverlight_Windows Phone 7 - Fatal编程技术网

Silverlight WP7检查互联网是否可用

Silverlight WP7检查互联网是否可用,silverlight,windows-phone-7,Silverlight,Windows Phone 7,我的应用程序WP7未被接受,因为如果互联网不可用,它将无法加载。我想办法检查一下,发现了这个命令 NetworkInterface.GetIsNetworkAvailable() 但是它不能在模拟器上工作,我也没有任何设备来测试它。 有人能告诉我如果设备处于飞行模式,它是否返回false吗?如果没有,我如何检查它 谢谢, 奥斯卡 编辑:我还尝试了以下代码: try { wsClient.CurrenciesCompleted += new EventHandler<Currency

我的应用程序WP7未被接受,因为如果互联网不可用,它将无法加载。我想办法检查一下,发现了这个命令

NetworkInterface.GetIsNetworkAvailable()

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

谢谢, 奥斯卡

编辑:我还尝试了以下代码:

try
{
    wsClient.CurrenciesCompleted += new EventHandler<CurrencyConversion.CurrenciesCompletedEventArgs>(wsClient_CurrenciesCompleted);
    wsClient.CurrenciesAsync(null);
}
catch
{
     NetworkNotAvailable();
}
试试看
{
wsClient.currencescompleted+=新事件处理程序(wsClient\u currencescompleted);
wsClient.currenceasync(空);
}
抓住
{
NetworkNotAvailable();
}
但我无法捕捉到异常,我也尝试了wsClient\u currencescompleted方法,但也没有效果

我在哪里可以测试它?

不要测试“一般的互联网”——测试您实际连接的服务。通过尝试连接到it来测试—在启动时提出一些简单、无损的请求。是的,这将占用用户的一小部分数据空间,但是:

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

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

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

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

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
    }
}

乔恩建议的另一种选择是检查哪个网络接口可用。如果您需要根据网络速度调整所调用的服务,这将非常方便。例如,可以修改下面的switch语句以返回表示网络质量的枚举

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;
      } 
   }
}
请参阅

GetIsNetworkAvailable()在设备上正常工作

您可以使用Microsoft.Devices.Environment.DeviceType在仿真器中模拟对此的处理以进行测试


我倾向于通过异常处理来测试互联网的可用性和网站的可用性,并向应用程序用户提供反馈,指出功能不可用的真正原因。

这是个好主意,但我该怎么做呢?因为如果我使用问题中编辑的代码,我无法捕获引发的异常:(我该在哪里接?谢谢,Oscar@Oscar:您已经说过要异步执行此操作…因此我希望在不同的线程中报告错误。如果不知道有关客户端的详细信息,就无法说明如何处理错误。我希望有某种方法可以注册错误条件的事件处理程序或som事情是这样的。刚刚发现:在silverlight中,您可以检查回调中的e.错误以处理异常:)tnks!@Oscar您从哪里获得
e.错误?@Matt在我的回调方法中(wsClient\u currencescompleted),在eventArgs中。有一个Result属性,您可以从中获取结果和错误,该属性存储一个异常:),它会在设备中返回false吗?@Oscar Yes。刚刚在设备上验证过。请注意,即使在飞行模式下,如果连接到PC,设备仍将返回true。啊,好的,但即使PC没有连接,它也会返回true?这对开发人员来说有点困惑,我认为好像它只是“有时”起作用。或者我对这种方法的想法是错误的吗?因为仿真器是作为虚拟机运行的,我会假设它总是能够检测到与主机PC的连接。对于栓系电话也是如此,因为它总是与栓系到的机器有连接。这种方法只是检测任何类型的可用网络连接。是的,我找到了这段代码,还找到了使用GetIsNetworkAvailable的代码。我必须说,我没有测试您编写的一个,因为我使用的是模拟器,所以我认为如果GetIsNetworkAvailable不起作用,这也不会起作用。但这是一个非常好的代码,以防需要这种“适应”,tks!