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 – Conexión Local

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

Tags: ,

3

Silverlight 4 – Conexión Local

 

Introducción

(Este artículo fue escrito originalmente para Silverlight 3 el cual podrán encontrar en esta dirección.)

En Silverlight 4 tenemos una característica que permite comunicarnos entre diferentes aplicaciones dentro de la misma máquina.  Esta característica está bautizada como Conexión Local (Local Connection en inglés).

Esta funcionalidad nos ofrece un mecanismo poderoso para poder complementar nuestros aplicativos que requieran tener comunicación entre sí, ya que implementar esta característica es bastante sencillo como lo demostraremos en este artículo.

System.Windows.Messaging

Todas las clases necesarias para la implementación de la conexión local entre aplicaciones están incluidas en el espacio de nombres System.Windows.Messaging

Clase LocalMessageSender

Esta clase permite el envío de mensajes a un receptor por medio del nombre especificado.  Además permite establecer el nombre del dominio en el que se encuentra el receptor.  Incluye el método SendAsync() el cual enviará el mensaje de manera asíncrona al receptor.  Una vez enviado el mensaje se disparará el evento SendCompleted, el cual incluye en sus argumentos la propiedad Error la cual nos indica si sucedió una excepción durante el envío del mensaje.

Clase LocalMessageReceiver

Análoga a la clase LocalMessageSender, esta clase nos permite recibir mensajes.  También aquí establecemos el nombre del receptor, que deberá concordar con el nombre establecido en el objeto de tipo LocalMessageSender.  Una vez recibido un mensaje se dispara el evento MessageReceived el cual incluye en sus argumentos la propiedad Message de tipo string, misma que contiene el mensaje enviado por la aplicación origen.

Además de esto podemos especificar los dominios válidos de los que puede recibir mensajes este objeto!

Modelo Publicador-Subscriptor

Es a través de este modelo publicador-subscriptor por el cual podemos implementar comunicación entre diferentes aplicaciones de Silverlight 4 en la misma página, o en diferentes pestañas del Navegador… incluso entre diferentes instancias de Navegadores, INCLUSO entre diferentes tipos de Navegadores (Internet Explorer, Firefox, Chrome, Safari, etc.!).

Es importante mencionar además que una aplicación de Silverlight no está limitada a ser únicamente publicador o subscriptor, sino que puede ser ambos!  Esto es, podemos establecer una comunicación local bidireccional entre aplicaciones.  El único requisito es tener los objetos LocalMessageSender y LocalMessageReceiver en cada aplicación de manera correcta.

La Solución

La solución que crearemos estará compuesta de dos aplicaciones Silverlight.  La aplicación Origen permitirá la captura de contenido Xaml dentro de un TextBox e incluirá un botón para enviar el Xaml a la aplicación Destino.

La aplicación Destino por su parte estará escuchando nuevos mensajes que le envíe la aplicación Origen.  Cuando llegue efectivamente un mensaje, interpretará el Xaml convirtiendo todo el árbol de contenido en los elementos visuales correspondientes al código, y los dibujará dentro de un Grid llamado LayoutRoot.

Ambos proyectos de Silverlight estarán contenidos en una misma solución, la cual también incluirá una Aplicación Web para poder probar la funcionalidad.  Además ambos proyectos estarán relacionados a la misma Aplicación Web para que nos cree automáticamente las páginas de prueba.  La siguiente figura muestra la estructura de la solución:

Origen

La aplicación Origen contiene un TextBox para escribir una cadena de Xaml válida que se enviará al destino.  Además contiene un botón que hará efectivamente el envío del mensaje.  El siguiente fragmento de código muestra la implementación de la aplicación Origen:

   1: using System.Windows;

   2:  

   3: using System.Windows.Controls;

   4:  

   5: using System.Windows.Messaging;

   6:  

   7:  

   8:  

   9: namespace SL3ConexionLocal.Origen

  10:  

  11: {

  12:  

  13:     public partial class MainPage : UserControl

  14:  

  15:     {

  16:  

  17:         LocalMessageSender sender;

  18:  

  19:         public MainPage()

  20:  

  21:         {

  22:  

  23:             InitializeComponent();

  24:  

  25:  

  26:  

  27:             sender = new LocalMessageSender("SL3ConexionLocal");

  28:  

  29:             

  30:  

  31:             SendXamlButton.Click += (s, a) =>

  32:  

  33:             {

  34:  

  35:                 sender.SendAsync(XamlTextBox.Text);

  36:  

  37:             };

  38:  

  39:             

  40:  

  41:             sender.SendCompleted += (s, a) =>

  42:  

  43:             {

  44:  

  45:                 if (a.Error != null)

  46:  

  47:                 {

  48:  

  49:                     MessageBox.Show(a.Error.Message);

  50:  

  51:                 }

  52:  

  53:             };

  54:  

  55:             

  56:  

  57:         }

  58:  

  59:  

  60:  

  61:     }

  62:  

  63: }

  64:  

Destino

La aplicación Destino recibirá el mensaje enviado por el Origen:

   1: using System;

   2:  

   3: using System.Windows;

   4:  

   5: using System.Windows.Controls;

   6:  

   7: using System.Windows.Messaging;

   8:  

   9: using System.Windows.Markup;

  10:  

  11:  

  12:  

  13: namespace SL3ConexionLocal.Destino

  14:  

  15: {

  16:  

  17:     public partial class MainPage : UserControl

  18:  

  19:     {

  20:  

  21:         public MainPage()

  22:  

  23:         {

  24:  

  25:             InitializeComponent();

  26:  

  27:  

  28:  

  29:             //Receptor/Receiver

  30:  

  31:             //Podemos especificar los dominios válidos de los que podrás recibir mensajes!

  32:  

  33:             //We can specify the domains where this object can receive messages from!

  34:  

  35:  

  36:  

  37:             LocalMessageReceiver receiver = new LocalMessageReceiver("SL3ConexionLocal");

  38:  

  39:             receiver.MessageReceived += (s, a) =>

  40:  

  41:             {

  42:  

  43:                 string message = a.Message;

  44:  

  45:                 try

  46:  

  47:                 {

  48:  

  49:                     UIElement newContent = (UIElement)XamlReader.Load(message);

  50:  

  51:  

  52:  

  53:                     LayoutRoot.Children.Clear();

  54:  

  55:                     LayoutRoot.Children.Add(newContent);

  56:  

  57:                 }

  58:  

  59:                 catch (Exception)

  60:  

  61:                 {

  62:  

  63:                     MessageBox.Show("No es un Xaml válido");

  64:  

  65:                 }

  66:  

  67:                 

  68:  

  69:             };

  70:  

  71:             receiver.Listen();

  72:  

  73:         }

  74:  

  75:     }

  76:  

  77: }

  78:  

Noten cómo se establece el nombre del receptor como “SL3ConexionLocal”.  Posteriormente se comienza a escuchar por mensajes usando el método Listen() y cuando uno es recibido efectivamente se interpreta a un objeto de tipo UIElement a través del método XamlReader.Load().

Al ejecutar la aplicación Origen en un Navegador y la aplicación Destino en otro (usando las páginas de prueba creadas automáticamente para cada aplicación) podemos comprobar esta funcionalidad:

Resumen

La Conexión Local incorporada en Silverlight 4 permite comunicarnos de una aplicación a otra a través de un mecanismo de publicación-subscripción.  Esta interesante y poderosa funcionalidad abre nuevos paradigmas en el desarrollo de aplicaciones RIA, ya que su modelo de programación es bastante sencillo y sus alcances en soluciones con Silverlight son innumerables.

Problemas en Conexión Local de Silverlight 3 con IE8

Posted on : 16-07-2009 | By : Rodrigo | In : IE8, Silverlight 3, Tips

Tags: , ,

2

Al parecer hay un problema en la versión final de Silverlight 3, cuando utilizamos la funcionalidad de Conexión Local.  El escenario es el siguiente:

En una aplicación en tengo un objeto de tipo LocalMessageSender para el envío de mensajes.  En otra aplicación (en otro proyecto diferente pero dentro de la misma solución) tengo un objeto de tipo LocalMessageReceiver.  Como sabrán ambas clases son el corazón de la funcionalidad de Conexiones Locales en Silverlight 3.  Ahora bien: si ejecutas cada aplicación en diferentes browsers pero del mismo tipo (ejemplo: IE-IE, FF-FF, Chrome-Chrome), funciona como debe ser, es decir, el mensaje es enviado del Sender al Receiver. 

El problema está cuando una de las dos aplicaciones la estás ejecutando en IE8 y la otra en otro tipo de navegador diferentes (FireFox o Chrome).  Parece ser que fuera-de-la-caja IE8 no permite tener una Conexión Local con otro tipo de navegador.  No obstante si haces la prueba entre FF-Chrome o Chrome-FF la Conexión Local de Silverlight 3 funciona a la perfección.

Este detalle lo encontré el día de hoy al impartir un Web Cast acerca de Silverlight 3 y aún no encuentro la solución al mismo.  Quiero pensar que es algún parámetro de configuración que me haga falta en IE8…

Tengo: Windows 7 64 bit, Visual Studio .NET 2008 c/SP1, SL3, SL3 Tools, IE8, Office 2010 CTP.

Les seguiré informando.