Aracılığıyla paylaş


ITrackingHandler Arabirim

Tanım

Uygulayan nesnenin uzaktan iletişim altyapısı tarafından nesneleri ve ara sunucuları hazırlama, özetleme ve bağlantısını kesme konusunda bilgilendirilmesi gerektiğini gösterir.

public interface class ITrackingHandler
public interface ITrackingHandler
[System.Runtime.InteropServices.ComVisible(true)]
public interface ITrackingHandler
type ITrackingHandler = interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type ITrackingHandler = interface
Public Interface ITrackingHandler
Öznitelikler

Örnekler

Aşağıdaki kod örneğinde uzaktan iletişim altyapısından bildirim almak için arabiriminin ITrackingHandler yöntemlerinin nasıl uygulandığı gösterilmektedir.

Aşağıdaki kod örneğinde bu arabirimin nasıl uygulandığı gösterilmektedir.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;

// Intercept marshal, unmarshal, and disconnect events for an object.
public class TrackingHandler : ITrackingHandler
{
    // Called when the tracked object is marshaled.

    public void MarshaledObject(Object obj, ObjRef objRef)
    {
        // Notify the user of the marshal event.
        Console.WriteLine("Tracking: An instance of {0} was marshaled.", 
            obj.ToString());

        // Print the channel information.
        if (objRef.ChannelInfo != null)
        {
            // Iterate over ChannelData.
            foreach(object data in objRef.ChannelInfo.ChannelData)
            {
                if (data is ChannelDataStore)
                {
                    // Print the URIs from the ChannelDataStore objects.
                    string[] uris = ((ChannelDataStore)data).ChannelUris;
                    foreach(string uri in uris)
                        Console.WriteLine("ChannelUri: " + uri);
                }
            }
        }

        // Print the envoy information.
        if (objRef.EnvoyInfo != null)
            Console.WriteLine("EnvoyInfo: " + objRef.EnvoyInfo.ToString());

        // Print the type information.
        if (objRef.TypeInfo != null)
        {
            Console.WriteLine("TypeInfo: " + objRef.TypeInfo.ToString());
            Console.WriteLine("TypeName: " + objRef.TypeInfo.TypeName);
        }

        // Print the URI.
        if (objRef.URI != null)
            Console.WriteLine("URI: " + objRef.URI.ToString());
    }

    // Called when the tracked object is unmarshaled.
    public void UnmarshaledObject(Object obj, ObjRef objRef)
    {
        Console.WriteLine("Tracking: An instance of {0} was unmarshaled.", 
            obj.ToString());
    }

    // Called when the tracked object is disconnected.
    public void DisconnectedObject(Object obj)
    {
        Console.WriteLine("Tracking: An instance of {0} was disconnected.", 
            obj.ToString());
    }
}

Aşağıdaki kod örneğinde, bu arabirimin bir sunucuda nasıl uygulandığı gösterilmektedir.

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

public class Server
{
    public static void Main(string[] args)
    {
        // Register the TCP channel.
        TcpChannel channel = new TcpChannel(1234);
        ChannelServices.RegisterChannel(channel);

        // Register a tracking handler.
        ITrackingHandler handler1 = new TrackingHandler();
        TrackingServices.RegisterTrackingHandler(handler1);

        // Register a second handler.
        ITrackingHandler handler2 = new TrackingHandler();
        TrackingServices.RegisterTrackingHandler(handler2);

        // Get the number of currently registered handlers.
        Console.WriteLine("Registered tracking handlers: " + 
            TrackingServices.RegisteredHandlers.Length);

        // Remove the tracking handler from the registered handlers.
        TrackingServices.UnregisterTrackingHandler(handler2);
        Console.WriteLine("Registered tracking handlers: " + 
            TrackingServices.RegisteredHandlers.Length);

        // Create and marshal an object for remote invocation.
        RemoteService service = new RemoteService();
        ObjRef obj = RemotingServices.Marshal(service, "TcpService");

        // Wait for the user prompt.
        Console.WriteLine("\r\nPress ENTER to unmarshal the object.");
        Console.ReadLine();

        // Unmarshal the object.
        RemotingServices.Unmarshal(obj);

        // Wait for the user prompt.
        Console.WriteLine("Press ENTER to disconnect the object.");
        Console.ReadLine();

        // Disconnect the object.
        RemotingServices.Disconnect(service);
    }
}

Aşağıdaki kod örneği, önceki kod örneğinde bu arabirimin sunucu için bir istemciye nasıl uygulanacaklarını gösterir.

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;

public class Client
{
    public static void Main(string[] args)
    {
        // Register the TCP channel.
        ChannelServices.RegisterChannel(new TcpChannel());

        // Register the client for the remote object.
        WellKnownClientTypeEntry remoteType = new WellKnownClientTypeEntry(
            typeof(RemoteService),"tcp://localhost:1234/TcpService");
        RemotingConfiguration.RegisterWellKnownClientType(remoteType);

        // Create an instance of the remote object.
        RemoteService service = new RemoteService(); 

        // Invoke a method on the remote object.
        service.Hello("world");
        Console.WriteLine("Hello invoked on server.");
    }
}

Aşağıdaki kod örneği, sunucu ve istemci tarafından kullanılan uzak nesneyi gösterir.

using System;

// Remote object.
public class RemoteService : MarshalByRefObject
{
    private DateTime startTime;

    public RemoteService()
    {
        // Notify the user that the constructor was invoked.
        Console.WriteLine("Constructor invoked.");
        startTime = DateTime.Now;
    }

    ~RemoteService()
    {
        // Notify the user that the finalizer was invoked.
        TimeSpan elapsedTime = 
            new TimeSpan(DateTime.Now.Ticks - startTime.Ticks);
        Console.WriteLine("Finalizer invoked after " + 
            elapsedTime.ToString() + " seconds.");
    }

    public void Hello(string name)
    {
        // Print a simple message.
        Console.WriteLine("Hello, " + name);
    }
}

Açıklamalar

ile kaydedilen TrackingServices her nesne, geçerli AppDomain nesne veya ara sunucu sıralandığında, özetlenmediğinde veya bağlantısı kesildiğinde uzaktan iletişim ile çağrılır.

Yalnızca nesnelerin bağlantısının kesilebileceğini unutmayın. Ara sunucuda bağlantı kesme çağrıldığında bir özel durum oluşur.

Not

Bu arabirim bir bağlantı talebi oluşturur. Hemen çağıran, arabirimine bir başvuru aracılığıyla çağrı yaparsa ve altyapı iznine sahip değilse bir SecurityException oluşturulur. Daha fazla bilgi için bkz. Bağlantı Talepleri .

Yöntemler

DisconnectedObject(Object)

Geçerli örneğe bir nesnenin ara sunucusuyla bağlantısının kesildiğini bildirir.

MarshaledObject(Object, ObjRef)

Geçerli örneğe bir nesnenin sıralandığını bildirir.

UnmarshaledObject(Object, ObjRef)

Geçerli örneğe bir nesnenin özetlenmediğini bildirir.

Şunlara uygulanır