Featured Posts

Silverlight 5 Ya DisponibleSilverlight 5 Ya Disponible El día de hoy 09 de Diciembre 2011 ha sido liberada la nueva versión de Silverlight 5.  Esta versión final es la 5.0.61118. ¿Qué es Silverlight? Silverlight es...

Readmore

Silverlight Tour–Actualizado a Silverlight 5 RTWSilverlight Tour–Actualizado a Silverlight 5... Tengo el gusto de anunciarles que el Curso que Da La Vuelta al Mundo, el famoso Silverlight Tour, ha sido actualizado a la versión final de Silverlight 5. El Silverlight...

Readmore

Nueva carrera en Microsoft Virtual Academy: Windows Phone 7.1 (Mango)Nueva carrera en Microsoft Virtual Academy: Windows... Tengo el gusto de darles a conocer la disponibilidad de una nueva carrera en el Microsoft Virtual Academy (MVA): La carrera de Windows Phone 7.1 Mango. Esta es la descripción...

Readmore

Nueva carrera en Microsoft Virtual Academy: Silverlight 4Nueva carrera en Microsoft Virtual Academy: Silverlight... ¿Eres estudiante de Microsoft Virtual Academy (MVA)? Tengo el gusto de anunciarles oficialmente el lanzamiento de la nueva carrera de Silverlight 4 para esta plataforma educativa. La...

Readmore

Curso gratuito de Introducción a Silverlight 4 – 2da. ParteCurso gratuito de Introducción a Silverlight... Tengo el gusto de informarles que ya está disponible la segunda parte del Curso gratuito de Introducción a Silverlight 4 en Español, el cual ahora consta de un total...

Readmore

Rodrigo Díaz Concha Rss

Silverlight 4 – Conciencia de Conexión

Posted on : 21-06-2010 | By : Rodrigo | In : Silverlight 4

Tags: ,

0

Silverlight 4 -  Conciencia de Conexión

El espacio de nombres System.Net.NetworkInformation de Silverlight, nos permite implementar una funcionalidad de “conciencia” de conexión en nuestras aplicaciones, esto es, saber en un momento dado si la aplicación está ejecutándose en un ambiente conectado o ha perdido la conexión; para poder determinar un comportamiento correcto en cada uno de esos escenarios.  Esta funcionalidad nos sirve tanto para aplicaciones que se estén ejecutando dentro del Navegador como en Aplicaciones Fuera del Navegador.

Clase NetworkInterface

Esta clase abstracta incluye el método estático GetIsNetworkAvailable(), el cual nos indica si hay una conexión de red o no.

Es muy importate mencionar que este método NO indica si hay una conexión a Internet.  Una manera para conocer si tenemos una conexión a Internet es hacer ping a un sitio conocido y con alta disponibilidad (ejemplo: www.microsoft.com, o www.yahoo.com, etc.) y/o utilizar las clase WebClient para descargar un archivo conocido en nuestro servidor donde esté hospedada la aplicación, por ejemplo: un archivo de texto pequeño que podamos descargar y leer para determinar si efectivamente tuvimos acceso a través de Internet.

El siguiente fragmento de código muestra cómo podemos utilizar NetworkInterface.GetIsNetworkAvailable() para determinar si tenemos una conexión de red:

   1: public MainPage()

   2: {

   3:     InitializeComponent();

   4:  

   5:     btn.Click += (s, a) => 

   6:     { 

   7:         txt.Text = NetworkInterface.GetIsNetworkAvailable().ToString(); 

   8:     };

   9: }

Clase NetworkChange

Un paso más adelante en esta funcionalidad está la clase NetworkChange la cual incluye el evento NetworkAddressChanged.  Este evento es disparado cuando hay un cambio en el estado de la conexión de red y está basado en el delegado NetworkAddressChangedEventHandler.  Si lo usamos junto con NetworkInterface.GetIsNetworkAvailable() podemos tener un mecanismo para automáticamente saber si nuestra aplicación está ejecutándose en un ambiente con o sin conexión.

   1: public MainPage()

   2: {

   3:     InitializeComponent();

   4:  

   5:     NetworkChange.NetworkAddressChanged += (s, a) =>

   6:     {

   7:         if (NetworkInterface.GetIsNetworkAvailable())

   8:         {

   9:             //Se ha restablecido la conexión de red

  10:         }

  11:         else

  12:         {

  13:             //No ha conexión de red

  14:         }

  15:     };

  16:     

  17: }

Nota: Este evento no se disparará si simplemente pones tu Navegador ‘Work Offline’

Construyendo la Clase NetworkChangeExtended

Gracias a que la clase NetworkChange no está marcada como sellada, podemos crear fácilmente una clase que extienda esta funcionalidad para determinar no solo si hay conectividad de red, sino determinar que exista realmente conexión a Internet.

A continuación les presento el código de una clase llamada NetworkChangeExtended, la cual efectivamente hereda de NetworkChange pero que incluye la funcionalidad para detectar si hay conexión de Internet o no, por medio del uso de un objeto de tipo WebClient para descargar un archivo de texto llamado Archivo.txt.  Archivo.txt deberá estar en el sitio de origen (/ClientBin de manera predeterminada) y deberá contener algo de texto.

   1: using System;

   2: using System.Net;

   3: using System.Net.NetworkInformation; 

   4:  

   5: namespace SL4ConcienciaConexion

   6: {    

   7:     

   8:     public class InternetAvailableEventArgs : EventArgs    

   9:     {        

  10:         public bool Available { get; set; }    

  11:     }

  12:  

  13:     public class NetworkInterfaceExtended : NetworkInterface    

  14:     {         

  15:         public static event EventHandler<InternetAvailableEventArgs> InternetAvailable;               

  16:         /// <summary>        

  17:         /// Español: Indica si hay conexión a Internet por medio de la descarga de un archivo a través de un objeto WebClient        

  18:         /// English: Indicates if there's Internet connection available through the download of a file using a WebClient object        

  19:         /// </summary>        

  20:         public static void GetIsInternetAvailable()        

  21:         {            

  22:             bool result = false;            

  23:             if (GetIsNetworkAvailable())            

  24:             {                

  25:                 WebClient client = new WebClient();                

  26:                 client.DownloadStringCompleted += (s, a) =>                

  27:                 {                    

  28:                     if (a.Error == null)                    

  29:                     {                        

  30:                         if (!string.IsNullOrEmpty(a.Result))                        

  31:                         {                            

  32:                             result = true;                        

  33:                         }                    

  34:                     }                    

  35:                     else                    

  36:                     {                        

  37:                         result = false;                    

  38:                     }                     

  39:                     OnInternetAvailable(result);                

  40:                 };                

  41:                 client.DownloadStringAsync(new Uri("Archivo.txt", UriKind.RelativeOrAbsolute));            

  42:             }            

  43:             else            

  44:             {                

  45:                 OnInternetAvailable(result);            

  46:             }         

  47:  

  48:         }   

  49:                

  50:         private static void OnInternetAvailable(bool available)        

  51:         {            

  52:             if (InternetAvailable != null)            

  53:             {                

  54:                 InternetAvailable(null, new InternetAvailableEventArgs() { Available = available });            

  55:             }        

  56:         }    

  57:     }

  58: }

Para usarla simplemente nos inscribimos al evento InternetAvailable, el cual se disparará cuando haya un cambio en el estado de la conexión a Internet.

   1: using System.Windows.Controls;

   2: using System.Net.NetworkInformation;

   3: namespace SL4ConcienciaConexion 

   4: { 

   5:     public partial class MainPage : UserControl 

   6:     { 

   7:         public MainPage() 

   8:         { 

   9:             InitializeComponent(); 

  10:             NetworkInterfaceExtended.InternetAvailable += (s, a) => 

  11:             { 

  12:                 txt.Text = a.Available.ToString(); 

  13:             }; 

  14:             Loaded += (s, a) => 

  15:             { 

  16:                 NetworkInterfaceExtended.GetIsInternetAvailable(); 

  17:             }; 

  18:             NetworkChange.NetworkAddressChanged += (s, a) => 

  19:             { 

  20:                 NetworkInterfaceExtended.GetIsInternetAvailable(); 

  21:             }; 

  22:         } 

  23:     } 

  24: }

Resumen

La funcionalidad de Conciencia de Conexión presente en Silverlight 4 es un instrumento bastante útil para que nuestras aplicaciones puedan determinar si están ejecutando en un ambiente con conectividad de red o no.  Asimismo, vimos cómo es fácil extender dicha funcionalidad para incluir un mecanismo de detección de acceso a Internet, a través de una clase que extienda la clase NetworkInterface y que haga uso de un objeto WebClient para descargar asíncronamete un archivo del servidor, por lo tanto determinar la presencia de una conexión a Internet.

Write a comment

Spam Protection by WP-SpamFree