Ejemplo de interacción remota: Publicación dinámica
.NET remoting sólo admite constructores predeterminados con tipos utilizables de forma remota y activados en el servidor. Si desea publicar un objeto después de crearlo con un determinado constructor y tiene un control total sobre la publicación de esta instancia en concreto, puede publicar su instancia mediante programación.
PRECAUCIÓN .NET remoting no autentica ni codifica de manera predeterminada. Por lo tanto, se recomienda que siga todos los procedimientos necesarios para asegurarse de la identidad de los clientes o servidores antes de interactuar con ellos de manera remota. Como las aplicaciones de .NET remoting requieren permisos FullTrust para ejecutarse, si a un cliente no autorizado se le ha concedido acceso en su servidor, el cliente podrá ejecutar código como si fuera de total confianza. Autentique siempre los extremos y codifique las secuencias de comunicación, ya sea alojando en Servicios de Internet Information Server (IIS) los tipos utilizados de forma remota o generando un par de receptores de canales personalizados para que se hagan cargo de este trabajo.
Para compilar y ejecutar este ejemplo
Escriba los siguientes comandos en el símbolo del sistema:
vbc -t:library remote.vb
vbc -r:System.Runtime.Remoting.dll -r:remote.dll server.vb
vbc -r:System.Runtime.Remoting.dll -r:remote.dll client.vb
Abra dos símbolos del sistema que apunten al mismo directorio. En uno de ellos, escriba server. En el otro, escriba client.
Para dejar de publicar el objeto utilizable de forma remota en varias etapas, presione ENTRAR en el símbolo del sistema del servidor y vuelva a ejecutar el cliente para observar las distintas excepciones generadas en las distintas etapas. Esta aplicación se ejecuta en un único equipo o a través de una red. Si desea ejecutar esta aplicación a través de una red, debe reemplazar "localhost" en la configuración del cliente con el nombre del equipo remoto.
remote.vb
Imports System
Public Class ServiceClass
Inherits MarshalByRefObject
Private m_starttime As DateTime
Public Sub New()
Console.WriteLine("ServiceClass created without constructor. Instance hash is " & Me.GetHashCode().ToString())
m_starttime = DateTime.Now
End Sub
Overrides Protected Sub Finalize()
Console.WriteLine("I'm being collected after " & (New TimeSpan(DateTime.Now.Ticks - m_starttime.Ticks)).ToString() & " seconds.")
MyBase.Finalize()
End Sub
Public Function GetServerTime() As DateTime
Console.WriteLine("Time requested by a client.")
Return DateTime.Now
End Function
Public ReadOnly Property InstanceHash() As Integer
Get
Return Me.GetHashCode()
End Get
End Property
End Class
Server.vb
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Http
Public Class ServerProcess
<MTAThread()> _
Public Shared Sub Main()
Dim channel As New HttpChannel(8080)
ChannelServices.RegisterChannel(channel)
Dim object1 As New ServiceClass()
' Creates the single instance of ServiceClass. All clients
' will use this instance.
Dim ref1 As ObjRef = RemotingServices.Marshal(object1, "object1uri")
Console.WriteLine("ObjRef.URI: " & ref1.URI)
Console.WriteLine("Running. Press Enter to end publication.")
Console.ReadLine()
' This unregisters the object from publication, but leaves
' the channel listening.
RemotingServices.Disconnect(object1)
Console.WriteLine()
Console.WriteLine("Disconnected the object. Client now receives a RemotingException.")
Console.WriteLine("Press Enter to unregister the channel.")
Console.ReadLine()
' At this point, the ServerClass object still exists. The server
' could republish it.
' This unregisters the channel, but leaves the application
' domain running.
ChannelServices.UnregisterChannel(channel)
Console.WriteLine("Unregistered the channel. Client now receives a WebException.")
' The ServerClass object still exists. The server could
' reregister the channel and republish the object.
Console.WriteLine("The host application domain is still running. Press Enter to stop the process.")
Console.ReadLine()
' The ServiceClass object's Finalize method writes a message to
' the console. A single object will almost always succeed in
' running its Finalize method before the Console is finalized;
' in a larger application, you could ensure that all objects
' finalize before the application ends by calling the garbage
' collector and waiting.
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub
End Class
Client.vb
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Channels.Http
Public Class ClientProcess
<MTAThread()> _
Public Shared Sub Main()
Dim channel As New HttpChannel(0)
ChannelServices.RegisterChannel(channel)
' Registers the remote class. (This could be done with a
' configuration file instead of a direct call.)
RemotingConfiguration.RegisterWellKnownClientType(Type.GetType("ServiceClass, remote"), "https://localhost:8080/object1uri")
' Instead of creating a new object, this obtains a reference
' to the server's single instance of the ServiceClass object.
Dim object1 As ServiceClass = New ServiceClass()
Try
Console.WriteLine("ServerTime: " & object1.GetServerTime())
Catch ex As Exception
Console.WriteLine("Exception of type: " & ex.GetType.ToString & " occurred.")
Console.WriteLine("Details: " & ex.Message)
End Try
End Sub ' Main
End Class ' ClientProcess
Vea también
Ejemplos de interacción remota | RemotingServices.Marshal (Método) | RemotingServices.Disconnect (Método) | ChannelServices.UnregisterChannel (Método)