Autor del articulo

Víctor Hurtado Díaz
¿Prefieres buscar los artículos por temas? Encuéntralos aquí
.Net Framework 2.0 (5)
ASP.net 2.0 (4)
Otras herramientas (1)
Windows Mobile (1)
Califica este artículo:
|
Estás en la categoría: .Net Framework 2.0
Puedes visitar artículos similares en: .Net Framework 2.0
Comunicación de aplicaciones con .NET Remoting
Este es un breve ejemplo de cómo implementar una aplicación distribuida utilizando .net Remoting sobre IIS como servidor de aplicaciones.
Con esto conseguimos distribuir la carga de procesamiento en varios servidores por si nuestra aplicación tiene demasiados usuarios simultáneos.
Debemos tomar en cuenta que mientras distribuyamos más los componentes de nuestra aplicación en equipos físicos, se tendrá un mayor retardo en la respuesta de la aplicación debido a la latencia producida por la red pero se ganará con la cantidad de usuarios concurrentes soportados por nuestra aplicación.
Para implementar nuestra solución primero debemos definir un proyecto de clases (en C# en este caso) con el fin de crear las interfaces que serán expuestas por nuestros objetos remotos. Este proyecto contendrá tantas interfaces como sean necesarias para exponer todos los métodos de los objetos remotos. El proyecto de interfaces debe crearse independientemente y deberá luego ser referenciado tanto por el cliente como por el servidor.
A continuación se presenta el código de la clase de interfaz de ejemplo (IMiInterfaz.cs):
namespace Vitucho.Remoting.Interfaces { public interface IMiInterfaz { string ObtenerHoraDelServidor(); void TestInsertar(int codigoTest); } } Luego procedemos a escribir un código para el lado servidor (objeto remoto a ser publicado en el IIS). Para el ejemplo se ha creado sólo una clase llamada cServidor
using System; using System.Collections.Generic; using System.Text; using Vitucho.Remoting.Interfaces;
namespace Vitucho.Remoting.Servidor { public class cServidor : MarshalByRefObject, IMiInterfaz { public string ObtenerHoraDelServidor() { //aqui devolvemos lo que solicita el cliente, en este caso, la hora del servidor return System.DateTime.Now.ToString(); } public void TestInsertar(int codigoTest) { throw new Exception("Ocurrió un error al intentar la inserción, inténtelo nuevamente"); } } } Cabe resaltar que la clase de ejemplo presentada (cServidor.cs) hereda de MarshalByRefObject, esta herencia permite transmitir los objetos que deriven de esta clase por la red. Además se está implementando la interfaz IMiInterfaz. Es importante eso para que luego el cliente de este objeto remoto pueda saber mediante dicha interfaz que propiedades y métodos tiene disponibles para consumir del objeto remoto.
Luego de compilar el proyecto de clases, se obtienen 2 dlls: la dll de la interfaz y la dll del proyecto de clases en si mismo; estas 2 librerías deberán luego ser alojadas en el servidor de aplicaciones que manejará la creación de objetos remotos que en nuestro caso será el IIS.
Primero: Cree un directorio virtual en el IIS y ubíquelo en la carpeta que crea conveniente. Segundo: Dentro de la carpeta creada en el paso anterior cree una carpeta llamada Bin y copie los 2 dlls generados del proyecto servidor mencionados anteriormente. Tercero: Cree un archivo web.config y ubíquelo en la raíz del directorio virtual recién creado con el siguiente contenido:
Cabe resaltar que la clase de ejemplo presentada (cServidor.cs) hereda de MarshalByRefObject, esta herencia permite transmitir los objetos que deriven de esta clase por la red. Además se está implementando la interfaz IMiInterfaz. Es importante eso para que luego el cliente de este objeto remoto pueda saber mediante dicha interfaz que propiedades y métodos tiene disponibles para consumir del objeto remoto.
Luego de compilar el proyecto de clases, se obtienen 2 dlls: la dll de la interfaz y la dll del proyecto de clases en si mismo; estas 2 librerías deberán luego ser alojadas en el servidor de aplicaciones que manejará la creación de objetos remotos que en nuestro caso será el IIS.
Primero: Cree un directorio virtual en el IIS y ubíquelo en la carpeta que crea conveniente. Segundo: Dentro de la carpeta creada en el paso anterior cree una carpeta llamada Bin y copie los 2 dlls generados del proyecto servidor mencionados anteriormente. Tercero: Cree un archivo web.config y ubíquelo en la raíz del directorio virtual recién creado con el siguiente contenido:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.runtime.remoting> <application> <service> <wellknown mode="Singleton" type="Vitucho.Remoting.Servidor.cServidor, Servidor" objectUri="Servidor.rem" /> </service> <channels> <channel ref="http" /> <serverProviders> <formatter href="binary" /> </serverProviders> </channels> </application> </system.runtime.remoting> </configuration> Algo que cabe resaltar del archivo presentado es lo siguiente: - La etiqueta wellknown deberá ser repetida tantas veces como clases se requiera exponer. - La propiedad type está formada por 2 elementos: el namespace completo en donde se encuentra la clase remota seguido del nombre de la clase y luego va el nombre del assembly. - La propiedad objecturi muestra el nombre con el que se identificará a la clase mencionada en la propiedad type. Para el caso la referencia a dicha clase sería http://nombreservidor/nombredirectoriovirtual/Servidor.rem
Luego sólo nos queda implementar la aplicación cliente, dicha aplicación puede ser una aplicación web, Windows, un servicio de Windows o cualquier tipo de aplicación soportada por .net. Para el ejemplo se implementó una aplicación Windows. En dicha aplicación Windows se deberá referenciar al proyecto de interfaces al igual que en el servidor con el fin de saber que métodos se exponen remotamente. Además se debe referenciar al namespace System.Runtime.Remoting
Aquí se presenta el código fuente del formulario Windows cliente que invoca a los 2 eventos expuestos por el servidor, en el segundo se muestra incluso como se propagan los errores desde el servidor hasta el cliente sin problemas.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;
using System.Runtime.Remoting; using Vitucho.Remoting.Interfaces;
namespace Cliente { public partial class frmCliente : Form { public frmCliente() { InitializeComponent(); }
private void btnHora_Click(object sender, EventArgs e) { IMiInterfaz oServidor = (IMiInterfaz)Activator.GetObject(typeof(Vitucho.Remoting.Interfaces.IMiInterfaz), "http://localhost/servidorrem/Servidor.rem"); MessageBox.Show(oServidor.ObtenerHoraDelServidor()); }
private void btnInsertar_Click(object sender, EventArgs e) { try { IMiInterfaz oServidor = (IMiInterfaz)Activator.GetObject(typeof(Vitucho.Remoting.Interfaces.IMiInterfaz), "http://localhost/servidorrem/Servidor.rem"); oServidor.TestInsertar(999); } catch(Exception ex) { MessageBox.Show(ex.Message); } } } } Para una información completa acerca de la comunicación entre aplicaciones utilizando .net puede visitar el MSDN en la sección:Comunicación remota de .net
Recuerde que si tiene algún comentario o necesita el desarrollo de alguna solución referente al artículo actual puede contactarme en el momento que lo necesite.
Palabras clave del artículo: Aplicación distribuida, .net, remoting, C#
|
|