Compartir a través de


Ejemplo de comunicación remota: servicio de seguimiento

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

La clase TrackingServices proporciona un servicio de seguimiento general con controladores del seguimiento conectables. Se llama a los métodos de la interfaz ITrackingHandler bajo las circunstancias siguientes:

  • Se ha generado un objeto ObjRef, (como resultado de un cálculo de referencias).

  • Se ha recibido un ObjRef, (como resultado de una resolución de referencias).

  • Se ha desconectado un objeto.

Para obtener más detalles, consulte TrackingServices y ITrackingHandler en la documentación de referencia.

3tzky0f2.Caution(es-es,VS.100).gifPrecaución:
La comunicación remota de .NET Framework no lleva a cabo la autenticación o el cifrado de forma predeterminada. Por consiguiente, se recomienda que dé todos los pasos necesarios para asegurarse de la identidad de los clientes o de los servidores antes de interactuar de forma remota con ellos. Dado que las aplicaciones remotas de .NET Framework exigen permisos FullTrust para ejecutarse, si a un cliente no autorizado se le permitiera el acceso a su servidor, el cliente podría ejecutar el código como si fuese un cliente de plena confianza. Autentique siempre sus extremos y cifre las secuencias de la comunicación, ya sea hospedando sus tipos remotos en Internet Information Services (IIS) o generando un par del receptor de canal personalizado para hacer este trabajo.

Para compilar y ejecutar este ejemplo

  1. Copie todos los archivos en un directorio.

  2. Escriba los siguientes comandos en el símbolo del sistema:

    vbc /t:library /r:System.Runtime.Remoting.dll TrackingHandler.vb
    vbc /t:library /r:System.Runtime.Remoting.dll RemoteType.vb
    vbc /r:RemoteType.dll /r:System.Runtime.Remoting.dll /r:TrackingHandler.dll server.vb
    vbc /r:RemoteType.dll /r:System.Runtime.Remoting.dll client.vb
    
    csc /t:library /r:System.Runtime.Remoting.dll TrackingHandler.cs
    csc /t:library /r:System.Runtime.Remoting.dll RemoteType.cs
    csc /r:RemoteType.dll /r:System.Runtime.Remoting.dll /r:TrackingHandler.dll server.cs
    csc /r:RemoteType.dll /r:System.Runtime.Remoting.dll client.cs
    
  3. Abra dos símbolos del sistema que señalen al mismo directorio. En uno, escriba server. En el otro, escriba client.

Esta aplicación se ejecuta en un solo 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 por el nombre del equipo remoto.

TrackingHandler

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Services

Public Class TrackingHandler
    Implements ITrackingHandler

    ' Notifies a handler that an object has been marshaled.
    Public Sub MarshaledObject(ByVal obj As Object, ByVal objref As System.Runtime.Remoting.ObjRef) Implements System.Runtime.Remoting.Services.ITrackingHandler.MarshaledObject
        Console.WriteLine("Tracking: An instance of {0} was marshaled. The instance HashCode is: {1}", _
            obj.ToString(), obj.GetHashCode().ToString())
        Console.WriteLine("ObjRef dump:")
        If (objref.ChannelInfo IsNot Nothing) Then
            Console.WriteLine("  -- ChannelInfo: ")
            DumpChannelInfo(objref.ChannelInfo)
        End If

        If (objref.EnvoyInfo IsNot Nothing) Then
            Console.WriteLine("  -- EnvoyInfo: " + CType(objref.EnvoyInfo, Object).ToString())
        End If
        If (objref.TypeInfo IsNot Nothing) Then
            Console.WriteLine("  -- TypeInfo: " + CType(objref.TypeInfo, Object).ToString())
            Console.WriteLine("      -- " + objref.TypeInfo.TypeName)
        End If
        If (objref.URI IsNot Nothing) Then
            Console.WriteLine("  -- URI: " + objref.URI.ToString())
        End If
    End Sub

    Private Sub DumpChannelInfo(ByVal info As IChannelInfo)
        Dim obj As Object
        For Each obj In info.ChannelData
            If (obj Is GetType(ChannelDataStore)) Then
                Dim uri As String
                For Each uri In CType(obj, ChannelDataStore).ChannelUris
                    Console.WriteLine("      -- ChannelUris:" + uri)
                Next
            End If
        Next

    End Sub

    ' Notifies a handler that an object has been unmarshaled.
    Public Sub UnmarshaledObject(ByVal obj As Object, ByVal [or] As System.Runtime.Remoting.ObjRef) Implements System.Runtime.Remoting.Services.ITrackingHandler.UnmarshaledObject
        Console.WriteLine("Tracking: An instance of {0} was unmarshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString())
    End Sub

    ' Notifies a handler that an object has been disconnected.
    Public Sub DisconnectedObject(ByVal obj As Object) Implements System.Runtime.Remoting.Services.ITrackingHandler.DisconnectedObject
        Console.WriteLine("Tracking: An instance of {0} was disconnected. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString())
    End Sub
End Class
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;

namespace TrackingHandler
{
    public class TrackingHandler : ITrackingHandler
    {
        // Notifies a handler that an object has been marshaled.
        public void MarshaledObject(Object obj, ObjRef objref)
        {
            Console.WriteLine("Tracking: An instance of {0} was marshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
            Console.WriteLine("ObjRef dump:");
            if (objref.ChannelInfo != null)
            {
                Console.WriteLine("  -- ChannelInfo: ");
                DumpChannelInfo(objref.ChannelInfo);
            }
            if (objref.EnvoyInfo != null)
                Console.WriteLine("  -- EnvoyInfo: " + objref.EnvoyInfo.ToString());
            if (objref.TypeInfo != null)
            {
                Console.WriteLine("  -- TypeInfo: " + objref.TypeInfo.ToString());
                Console.WriteLine("      -- " + objref.TypeInfo.TypeName);
            }
            if (objref.URI != null)
                Console.WriteLine("  -- URI: " + objref.URI.ToString());
        }

        private void DumpChannelInfo(IChannelInfo info)
        {

            foreach (object obj in info.ChannelData)
            {
                if (obj is ChannelDataStore)
                {
                    foreach (string uri in ((ChannelDataStore)obj).ChannelUris)
                        Console.WriteLine("      -- ChannelUris:" + uri);
                }
            }
        }

        // Notifies a handler that an object has been unmarshaled.
        public void UnmarshaledObject(Object obj, ObjRef or)
        {
            Console.WriteLine("Tracking: An instance of {0} was unmarshaled. The instance HashCode is: {1}", obj.ToString(), obj.GetHashCode().ToString());
        }

        // Notifies a handler that an object has been disconnected.
        public void DisconnectedObject(Object obj)
        {
            Console.WriteLine("Tracking: An instance of {0} was disconnected. The instance HashCode is: {1}", 
                obj.ToString(), obj.GetHashCode().ToString());
        }
    }
}

RemoteType

Imports System

Public Class ServiceClass
    Inherits MarshalByRefObject

    Private starttime As DateTime

    Public Sub New()
        Console.WriteLine("A ServiceClass has been created.")
        starttime = DateTime.Now
    End Sub

    Protected Overrides Sub Finalize()
        Console.WriteLine("ServiceClass being collected after " & (New TimeSpan(DateTime.Now.Ticks - starttime.Ticks)).ToString() & " seconds.")
    End Sub

    Public Function GetServerTime() As DateTime
        Console.WriteLine("Time requested by client")
        Return DateTime.Now
    End Function
End Class
using System;

namespace RemoteType
{
    public class ServiceClass : MarshalByRefObject
    {
        private DateTime starttime;

        public ServiceClass()
        {
            Console.WriteLine("A ServiceClass has been created.");
            starttime = DateTime.Now;
        }

        ~ServiceClass()
        {
            Console.WriteLine("ServiceClass being collected after " + (new TimeSpan(DateTime.Now.Ticks - starttime.Ticks)).ToString() + " seconds.");
        }

        public DateTime GetServerTime()
        {
            Console.WriteLine("Time requested by client.");
            return DateTime.Now;
        }
    }
}

Server

[Visual Basic]

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Services
Imports TrackingHandler

Public Class Server
    Public Shared Sub Main()
        Dim channel As TcpChannel = New TcpChannel(8080)
        ChannelServices.RegisterChannel(channel, False)

        TrackingServices.RegisterTrackingHandler(New TrackingHandler())

        Dim service As ServiceClass = New ServiceClass()
        Dim obj As ObjRef = RemotingServices.Marshal(service, "TcpService")

        Console.WriteLine("Press Enter to unmarshal the object.")
        Console.ReadLine()

        RemotingServices.Unmarshal(obj)

        Console.WriteLine("Press Enter to disconnect the object.")
        Console.ReadLine()

        RemotingServices.Disconnect(service)
    End Sub
End Class

[C#]

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Services;
using TrackingHandler;
using RemoteType;

namespace Server
{
    public class Server
    {
        public static void Main(string[] Args)
        {
            TcpChannel channel = new TcpChannel(8080);
            ChannelServices.RegisterChannel(channel, false);

            TrackingServices.RegisterTrackingHandler(new TrackingHandler.TrackingHandler());

            ServiceClass service = new ServiceClass();
            ObjRef obj = RemotingServices.Marshal(service, "TcpService");

            Console.WriteLine("\r\nPress Enter to unmarshal the object.");
            Console.ReadLine();

            RemotingServices.Unmarshal(obj);

            Console.WriteLine("Press Enter to disconnect the object.");
            Console.ReadLine();

            RemotingServices.Disconnect(service);
        }
    }
}

Client

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp

Public Class Client

    Public Shared Sub Main()
        ChannelServices.RegisterChannel(New TcpChannel(), False)

        Dim remotetype As WellKnownClientTypeEntry = New WellKnownClientTypeEntry( _
            GetType(ServiceClass), _
            "tcp://localhost:8080/TcpService")
        RemotingConfiguration.RegisterWellKnownClientType(remotetype)

        Dim service As ServiceClass = New ServiceClass()
        Console.WriteLine("Server time is: " & service.GetServerTime().ToLongTimeString())
    End Sub

End Class
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using RemoteType;

namespace Client
{
    public class ClientProcess
    {
        public static void Main(string[] Args)
        {
            ChannelServices.RegisterChannel(new TcpChannel(), false);

            WellKnownClientTypeEntry remotetype = new WellKnownClientTypeEntry(
                typeof(ServiceClass), 
                "tcp://localhost:8080/TcpService");
            RemotingConfiguration.RegisterWellKnownClientType(remotetype);

            ServiceClass service = new ServiceClass();
            Console.WriteLine("Server time is: " + service.GetServerTime().ToLongTimeString());
        }
    }
}

Vea también

Referencia

ITrackingHandler
TrackingServices

Otros recursos

Ejemplos de comunicación remota