Como saber si estoy conectado a Internet desde Windows Phone

Un requisito importante para poder brindarle al usuario de Windows Phone, una experiencia agradable, es determinar si su dispositivo esta conectado o no a Internet, hay variados articulos en la red que pueden probar, uno de ellos es este que incluso viene acompanado de un proyecto, es un ejemplo utilizado por Nokia, lamentablemente no funciona o al menos no pude hacer que funcione correctamente y si observan el codigo es bastante ‘elaborado’ para una tarea que es bastante sencilla.

Entonces decidi usar mi propia aproximacion, debo decir que en mi aplicacion actualmente publicada en internet usa la version de codigo que mostrare mas adelante, por lo que puedo garantizar con certeza de que si funciona, ademas de que este articulo es una continuacion prometida de un articulo anterior, en el que explico como detectar internet en aplicaciones Windows y Web.

La idea se centra nuevamente en usar el NCSI de Microsoft, para la tarea y el codigo es el siguiente:

public void IsNCSIConnected(Action<bool> connected)
{
    try
    {
        var x = (HttpWebRequest)WebRequest.Create("http://www.msftncsi.com/ncsi.txt");
        x.BeginGetResponse((resp) =>
                               {
                                   try
                                   {
                                       var response = (HttpWebResponse) x.EndGetResponse(resp);
                                       connected(response.StatusCode == HttpStatusCode.OK);
                                   }
                                   catch
                                   {
                                       connected(false);
                                   }
                               }, null);
    }
    catch (Exception)
    {
        connected(false);
    }
}

Como pueden observar el codigo se basa en la utilizacion de un Delegado Action que devolvera el estado de la conexion. Este metodo me resulto muy util pero se complica cuando manejamos escenarios asincronos, porque quierase o no, bloqueara el hilo de ejecucion de la UI. Entonces pense en una variante mas ‘interesante’.

public async Task<bool> IsNCSIConnected()
{
    var req = (HttpWebRequest)HttpWebRequest.Create("http://www.msftncsi.com/ncsi.txt");
    Task<HttpWebResponse> requestTask = Task.Factory.FromAsync(
        req.BeginGetResponse, result =>
                                  {
                                      try
                                      {
                                          return (HttpWebResponse) req.EndGetResponse(result);
                                      }
                                      catch (Exception)
                                      {

                                          return null;
                                      }
                                      
                                  },
        TaskCreationOptions.None);

    return await requestTask.ContinueWith(responseTask =>
                                                           {
                                                               if (responseTask.Result == null) return false;
                                                               return responseTask.Result.StatusCode ==
                                                                      HttpStatusCode.OK;
                                                           });
}

El codigo puede parecer algo mas complicado, sin embargo la utilizacion es mucho mas simple.

Un Saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *