Remoting-instanciar un objeto remoto en el cliente.

05/09/2004 - 19:35 por JPablo | Informe spam
Recientemente estoy investigando sobre la implementación
de la tecnologia Remoting, y soy novato y por lo mismo
inicio con algunas dudas:

He diseñado un objeto remoto para que pueda ser accesado
desde otras aplicaciones y computadoras, y el ensamblado
lo he nombrado RemoteObject.dll, este es el codigo:

using System;
using System.Data;
using System.Data.SqlClient;

public class ProductsDB : MarshalByRefObject
{

private static string connectionString
= "Server=localhost;Database=Northwind;Uid=deveolop;Pwd=dev
eloper";

public DataTable GetProducts()
{
string SQL = "SELECT * FROM Products";

//Create ADO.NET objects.
SqlConnection con = new SqlConnection
(connectionString);
SqlCommand com = new SqlCommand
(SQL, con);
SqlDataAdapter adapter = new SqlDataAdapter
(com);
DataSet ds = new DataSet();

//Execute the command.
try
{
con.Open();
adapter.Fill(ds, "Products");
}
catch(Exception err)
{
Console.WriteLine(err.ToString());

}
finally
{
con.Close();
}

return ds.Tables[0];
}

//This method allows you to verify that the object
is running remotely.
public string GetHostLocation()
{

return
AppDomain.CurrentDomain.FriendlyName;
}

};

Despues he diseñado un component host para registrar los
tipos remotos con la infraestructura .NET Remoting usando
la clase RemotingConfiguration, este es el codigo:

using System;
using System.Runtime.Remoting;

public class Server
{

private static void Main()
{
//Register the remotable classes.
RemotingConfiguration.Configure
("Server.exe.config");

//As long as this application is running, the
remote objects
//will be accessible.
Console.WriteLine("Press a key to shut down
the server.");
Console.ReadLine();
}

};

como ven tengo en un archivo de configuración para
establecer las clases que soportara, los puertos para la
comunicación entre la red y el Uniform Resource Identifier
(URI) que el cliente usara para accesar al objeto.
un fragmento de este archivo .cobfig es el siguiente:

<configuration>
<system.runtime.remoting>
<application>
<!-- Define the remotable object. -
->
<service>
<wellknown
mode = "SingleCall"
type
= "RemoteObject.ProductsDB, RemoteObject"
objectUri
= "RemoteObject" />
</service>

<!-- Define the protocol used for
network access.
you can use tcp or http
channels. -->
<channels>
<channel ref="tcp"
port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

y por último he desarrollado una aplicación cliente que
también implementa un archivo .config para indicar la URL
del objeto remoto y su tipo, este es el archivo .config
del cliente:

<configuration>
<system.runtime.remoting>
<application>
<!-- Define the object this
application will access remotely. -->
<client>
<wellknown type
= "RemoteObject.ProductsDB, RemoteObject"
url
= "tcp://servernet:9080/RemoteObject" />
</client>

<!-- Define the protocol used for
network access.
The protocol must match the
component host, but any port is valid.
A port of 0
means "dynamically choose an available port." -->
<channels>
<channel ref="tcp"
port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

y bueno este es la clase del cliente:


using System;
using System.Data;
using System.Runtime.Remoting;
using RemoteObject;

public class Client
{

private static void Main()
{
//Register the classes that will be accesed
remotely.
RemotingConfiguration.Configure
("Client.exe.config");


//(Now any attempts to instantiate the
RemoteObjects.ProductsDB
//class will actually create a proxy to a
remote instance.)

//Interact with the remote object through a
proxy.
ProductsDB proxy = new ProductsDB();

//Display the name of the component host
application domain
// where the object executes.
Console.WriteLine("Object executing in: " +
proxy.GetHostLocation());

//Get the DataSet and display its contents.
DataTable dt = proxy.GetProducts();

foreach (DataRow row in dt.Rows)
{
Console.WriteLine(row[1]);
}



}

};

Bien anexe un poco de codigo para ser más explicito, mi
primera duda es:

(*) En esta última clase, la cual es la del cliente tengo
que hacer referencia al ensamblado RemoteObject.dll, sin
embargo esto no se como lograrlo, dado que el ensamblado
se encuentra en otra maquina de la red y mi aplicación
cliente la estoy ejecutando en mi PC ?¿, esto lo menciono
por que he leeido un fragmento en la red que dice lo
siguiente "To instantiate a remote object, the client
needs to have a reference to the assembly where the class
is defined. This presents an additional deployment step,
which you can avoid by using an interface that defines the
supported functionality." y si ustedes se dan cuenta
utilizo: using RemoteObject; pero como hacer referencia
al ensamblado si este se encuentra en otra maquina ?¿

(*)El component host y el ensamblado RemoteObject.dll los
tengo alojados en el servidor, pero he leeido que el
ensamblado remoto puede estar en la Global Assembly Cache
ó en la misma ruta que se encuentra el component host ?¿
cual es lo recomendado para alojar objetos remotos ?¿

(*)Si el ensamblado RemoteObject.dll debe de estar en la
cache de ensamblados, debo de registarlo de la siguiente
forma ?¿:
gacutil -i RemoteObject.dll

(*)He leeido que con todas las instalaciones de .NET se
instala la cache global de ensamblados, sin embargo si yo
realizo una instalación de mi aplicación para distribuirla
con otra compañia tengo que instalar afuerzas el .NET para
que me instale la cache global de ensamblados y poder
registrar los objetos remotos en esta cache ?¿

(*) En base a su experiencia como recomendarian
implementar la tecnologia Remoting, dado que mi intención
es diseñar la capa de acceso a datos de mi aplicación
utilizando Remoting para que si en algun momento realize
cambios sobre el acceso a datos, pues solo actualize el
ensamblado de esa capa en el application-server y de esta
forma todos los clientes tendran esta actualización ?
conocen algunos ejemplos que me puedan orientar un poco
más sobre esta tecnologia ?¿

De antemano gracias por leer mi nota, si esta un poco
larga pero la verdad soy novato en esta tecnologia y
expongo estas preguntas.
Saludos.
 

Leer las respuestas

#1 pablo crosio
06/09/2004 - 16:44 | Informe spam
hola!

lo que debes hacer para referenciar tu ensamble
RemoteObject.dll es tener fisicamente la dll en el cliente;
no existe otra forma si queres utilizar este ensamble.
luego cuando se activa el objeto remoto, la implementacion
de dll que en realidad se utiliza es la del servidor.

una alternativa como bien nombras, es a traves de
interfases; aqui sin embargo, la forma de activar los
objetos cambia un poco, te paso este link que explica como
implementar remoting con interfases:

http://www.c-
sharpcorner.com/Tutorials/UsingInterfacesInNetRemotingDT003
.asp

de esta forma, y una vez creada la interfaz, solamente
copiarias la misma al cliente, pero no toda la
implementacion.

existe otra forma alternativa, a traves de la utilizacion
de soapsuds.exe, pero el servicio debe trabajar con soap
para que funcione consulta por la herramienta soapsuds
y su uso...

salu2!!

pablo


Recientemente estoy investigando sobre la implementación
de la tecnologia Remoting, y soy novato y por lo mismo
inicio con algunas dudas:

He diseñado un objeto remoto para que pueda ser accesado
desde otras aplicaciones y computadoras, y el ensamblado
lo he nombrado RemoteObject.dll, este es el codigo:

using System;
using System.Data;
using System.Data.SqlClient;

public class ProductsDB : MarshalByRefObject
{

private static string connectionString
= "Server=localhost;Database=Northwind;Uid=deveolop;Pwd=de


v
eloper";

public DataTable GetProducts()
{
string SQL = "SELECT * FROM Products";

//Create ADO.NET objects.
SqlConnection con = new SqlConnection
(connectionString);
SqlCommand com = new SqlCommand
(SQL, con);
SqlDataAdapter adapter = new SqlDataAdapter
(com);
DataSet ds = new DataSet();

//Execute the command.
try
{
con.Open();
adapter.Fill(ds, "Products");
}
catch(Exception err)
{
Console.WriteLine(err.ToString());

}
finally
{
con.Close();
}

return ds.Tables[0];
}

//This method allows you to verify that the object
is running remotely.
public string GetHostLocation()
{

return
AppDomain.CurrentDomain.FriendlyName;
}

};

Despues he diseñado un component host para registrar los
tipos remotos con la infraestructura .NET Remoting usando
la clase RemotingConfiguration, este es el codigo:

using System;
using System.Runtime.Remoting;

public class Server
{

private static void Main()
{
//Register the remotable classes.
RemotingConfiguration.Configure
("Server.exe.config");

//As long as this application is running, the
remote objects
//will be accessible.
Console.WriteLine("Press a key to shut down
the server.");
Console.ReadLine();
}

};

como ven tengo en un archivo de configuración para
establecer las clases que soportara, los puertos para la
comunicación entre la red y el Uniform Resource Identifier
(URI) que el cliente usara para accesar al objeto.
un fragmento de este archivo .cobfig es el siguiente:

<configuration>
<system.runtime.remoting>
<application>
<!-- Define the remotable object. -
->
<service>
<wellknown
mode = "SingleCall"
type
= "RemoteObject.ProductsDB, RemoteObject"
objectUri
= "RemoteObject" />
</service>

<!-- Define the protocol used for
network access.
you can use tcp or http
channels. -->
<channels>
<channel ref="tcp"
port="9080" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

y por último he desarrollado una aplicación cliente que
también implementa un archivo .config para indicar la URL
del objeto remoto y su tipo, este es el archivo .config
del cliente:

<configuration>
<system.runtime.remoting>
<application>
<!-- Define the object this
application will access remotely. -->
<client>
<wellknown type
= "RemoteObject.ProductsDB, RemoteObject"
url
= "tcp://servernet:9080/RemoteObject" />
</client>

<!-- Define the protocol used for
network access.
The protocol must match the
component host, but any port is valid.
A port of 0
means "dynamically choose an available port." -->
<channels>
<channel ref="tcp"
port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>

y bueno este es la clase del cliente:


using System;
using System.Data;
using System.Runtime.Remoting;
using RemoteObject;

public class Client
{

private static void Main()
{
//Register the classes that will be accesed
remotely.
RemotingConfiguration.Configure
("Client.exe.config");


//(Now any attempts to instantiate the
RemoteObjects.ProductsDB
//class will actually create a proxy to a
remote instance.)

//Interact with the remote object through a
proxy.
ProductsDB proxy = new ProductsDB();

//Display the name of the component host
application domain
// where the object executes.
Console.WriteLine("Object executing in: " +
proxy.GetHostLocation());

//Get the DataSet and display its contents.
DataTable dt = proxy.GetProducts();

foreach (DataRow row in dt.Rows)
{
Console.WriteLine(row[1]);
}



}

};

Bien anexe un poco de codigo para ser más explicito, mi
primera duda es:

(*) En esta última clase, la cual es la del cliente tengo
que hacer referencia al ensamblado RemoteObject.dll, sin
embargo esto no se como lograrlo, dado que el ensamblado
se encuentra en otra maquina de la red y mi aplicación
cliente la estoy ejecutando en mi PC ?¿, esto lo menciono
por que he leeido un fragmento en la red que dice lo
siguiente "To instantiate a remote object, the client
needs to have a reference to the assembly where the class
is defined. This presents an additional deployment step,
which you can avoid by using an interface that defines


the
supported functionality." y si ustedes se dan cuenta
utilizo: using RemoteObject; pero como hacer referencia
al ensamblado si este se encuentra en otra maquina ?¿

(*)El component host y el ensamblado RemoteObject.dll los
tengo alojados en el servidor, pero he leeido que el
ensamblado remoto puede estar en la Global Assembly Cache
ó en la misma ruta que se encuentra el component host ?¿
cual es lo recomendado para alojar objetos remotos ?¿

(*)Si el ensamblado RemoteObject.dll debe de estar en la
cache de ensamblados, debo de registarlo de la siguiente
forma ?¿:
gacutil -i RemoteObject.dll

(*)He leeido que con todas las instalaciones de .NET se
instala la cache global de ensamblados, sin embargo si yo
realizo una instalación de mi aplicación para


distribuirla
con otra compañia tengo que instalar afuerzas el .NET


para
que me instale la cache global de ensamblados y poder
registrar los objetos remotos en esta cache ?¿

(*) En base a su experiencia como recomendarian
implementar la tecnologia Remoting, dado que mi intención
es diseñar la capa de acceso a datos de mi aplicación
utilizando Remoting para que si en algun momento realize
cambios sobre el acceso a datos, pues solo actualize el
ensamblado de esa capa en el application-server y de esta
forma todos los clientes tendran esta actualización ?
conocen algunos ejemplos que me puedan orientar un poco
más sobre esta tecnologia ?¿

De antemano gracias por leer mi nota, si esta un poco
larga pero la verdad soy novato en esta tecnologia y
expongo estas preguntas.
Saludos.
.

Preguntas similares