2010-12-07 14 views
5

Mi aplicación WP7 no se ha aceptado porque no se carga si Internet no está disponible. Me buscado una manera de comprobarlo y encontró este comandoWP7 compruebe si Internet está disponible

NetworkInterface.GetIsNetworkAvailable()

Pero no está trabajando en el emulador y no tengo ningún dispositivo para probarlo. ¿Podría alguien decirme si devuelve falso si el dispositivo está en modo avión? Si no, ¿cómo puedo verificarlo?

Gracias, Oscar

Editar: También probé con este código:

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

Pero no soy capaz de detectar la excepción, también probé en el método wsClient_CurrenciesCompleted, sino que también no es bueno .

¿Dónde podría probarlo?

Respuesta

6

No haga pruebas para "Internet en general": pruebe el servicio al que realmente se va a conectar. Pruébelo intentando conectarse a él: realice una solicitud simple y no destructiva al inicio. Sí, que tendrá un poco de asignación de datos del usuario, pero:

  • Se le calentando la pila de red y hacer una conexión que debe llegar a ser mantenido con vida de forma automática, se reducirá de manera futuro latencia.
  • Puede advertir al usuario que pueden tener una funcionalidad limitada si falla la conexión.
+0

Eso sería una gran idea, pero ¿cómo podría hacer eso?Porque si utilizo el código que edité en la pregunta, no puedo ver la excepción que se lanza :( ¿Dónde debería encontrarlo? Gracias, Oscar – JSBach

+1

@Oscar: Bueno, has dicho que quieres hágalo de forma asincrónica ... así que esperaría que el error se informara en un hilo diferente. Sin conocer los detalles sobre su cliente, es imposible decir cómo manejaría el error. Espero que haya alguna forma de hacerlo. de registrar un controlador de eventos para una condición de error, o algo así. –

+0

Acabo de enterarme: en Silverlight puede verificar el error e.En la devolución de llamada para manejar la excepción :) tnks! – JSBach

2

GetIsNetworkAvailable() siempre devolverá verdadero en el emulador. Para probar en el emulador, tendrás que trabajar alrededor de esto en el código.

Esto puede ser una verificación rápida pero también (como señaló Jon) debe manejar el escenario de no poder conectarse a su servidor específico.

Manejando esto se puede hacer mediante la captura de la WebException cuando intenta obtener la respuesta en la devolución de llamada.

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

¿Y devolverá falso en los dispositivos? – JSBach

+0

@Oscar Sí. Solo verificado en un dispositivo. Tenga en cuenta que incluso en modo de vuelo, un dispositivo seguirá siendo cierto si está conectado a una PC. –

+0

Ah, vale, ¿pero vuelve verdadero incluso si la PC no tiene conexión? eso es un poco confuso para el desarrollador, como si solo funcionara "a veces", creo. ¿O me salió mal la idea de este método? – JSBach

3

Una alternativa a la sugerencia de Jon es comprobar qué interfaz de red está disponible. Esto es muy útil en los casos en que necesite ajustar a qué servicio llama según la velocidad de la red. Por ejemplo, la instrucción switch a continuación podría modificarse para devolver un Enum para representar la calidad de la red.

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

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

+0

Sí, encontré este código y también encontré el que usa GetIsNetworkAvailable. Debo decir que no probé la que escribiste porque estoy usando un emulador, así que suponía que si GetIsNetworkAvailable no funcionaba, tampoco funcionaría. ¡Pero este es un código muy bueno en caso de que se necesite esta "adaptación", tks! – JSBach

0

GetIsNetworkAvailable() funciona correctamente en el dispositivo.

Puede simular que maneja esto para probar en el emulador usando Microsoft.Devices.Environment.DeviceType.

Me gustaría probar tanto la disponibilidad de Internet como la disponibilidad de su sitio a través del manejo de excepciones y proporcionar retroalimentación al usuario de la aplicación que indica cuál es el verdadero motivo para que las funciones no estén disponibles.

Cuestiones relacionadas