WP7 проверь доступность интернета - PullRequest
5 голосов
/ 07 декабря 2010

Мое приложение WP7 не было принято, поскольку оно не загружается, если Интернет недоступен. Я искал способ проверить это и нашел эту команду

NetworkInterface.GetIsNetworkAvailable()

Но он не работает на эмуляторе, и у меня нет устройства для его проверки. Может кто-нибудь сказать мне, если он возвращает false, если устройство находится в режиме полета? Если нет, то как я могу проверить это?

Спасибо, Оскар

Редактировать: я также пытался с этим кодом:

try
{
    wsClient.CurrenciesCompleted += new EventHandler<CurrencyConversion.CurrenciesCompletedEventArgs>(wsClient_CurrenciesCompleted);
    wsClient.CurrenciesAsync(null);
}
catch
{
     NetworkNotAvailable();
}

Но я не могу поймать исключение, я также пытался в методе wsClient_CurrenciesCompleted, но тоже не хорошо.

Где я могу это проверить?

Ответы [ 4 ]

6 голосов
/ 07 декабря 2010

Не проверяйте «Интернет в целом» - проверьте сервис, к которому вы фактически подключаетесь. Проверьте это, попытавшись подключиться к нему - сделайте простой, неразрушающий запрос при запуске. Да, это займет немного информации от пользователя, но:

  • Вы будете прогревать сетевой стек и устанавливать соединение, которое должно автоматически поддерживаться в рабочем состоянии, поэтому задержка в будущем будет уменьшена.
  • Вы можете предупредить пользователя, что у него может быть ограниченная функциональность в случае сбоя соединения.
3 голосов
/ 07 декабря 2010

Альтернатива предложению Джона - проверить, какой сетевой интерфейс доступен.Это очень удобно в тех случаях, когда вам нужно настроить, какую услугу вы вызываете, исходя из скорости сети.Например, приведенный ниже оператор switch можно изменить, чтобы он возвращал Enum для представления качества сети.

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

2 голосов
/ 07 декабря 2010

GetIsNetworkAvailable() всегда будет возвращать true в эмуляторе.Для тестирования в эмуляторе вам нужно обойти это в коде.

Это может быть полезной быстрой проверкой, но вам также (как указал Джон) нужно разобраться со сценарием невозможности подключения кваш конкретный сервер.

Обработка этого может быть выполнена путем перехвата 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
    }
}
0 голосов
/ 08 декабря 2010

GetIsNetworkAvailable () правильно работает на устройстве.

Вы можете посмеяться над этим для тестирования в эмуляторе с помощью Microsoft.Devices.Environment.DeviceType.

Я был бы склонен проверить как доступность Интернета, так и доступность вашего сайта посредством обработки исключений и предоставить отзыв пользователю приложения, который указывает истинную причину отсутствия функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...