Silverlight 4 – Conexión Local
Posted on : 21-06-2010 | By : Rodrigo | In : Silverlight 4
Tags: conexion local, Silverlight 4
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.






