ITrackingHandler 接口
定义
指示实现对象必须得到由远程结构发出的有关对象与代理的封送处理、取消封送处理和断开的通知。Indicates that the implementing object must be notified of marshaling, unmarshaling, and disconnection of objects and proxies by the remoting infrastructure.
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
- 属性
示例
下面的代码示例演示如何实现接口的方法 ITrackingHandler ,以便从远程处理基础结构接收通知。The following code example shows how to implement the methods of the ITrackingHandler interface to receive notifications from the remoting infrastructure.
下面的代码示例演示如何实现此接口。The following code example shows how to implement this interface.
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.
[System.Security.Permissions.SecurityPermissionAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Flags=System.Security.Permissions.SecurityPermissionFlag.Infrastructure)]
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.
[System.Security.Permissions.SecurityPermissionAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Flags=System.Security.Permissions.SecurityPermissionFlag.Infrastructure)]
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.
[System.Security.Permissions.SecurityPermissionAttribute(
System.Security.Permissions.SecurityAction.LinkDemand,
Flags=System.Security.Permissions.SecurityPermissionFlag.Infrastructure)]
public void DisconnectedObject(Object obj)
{
Console.WriteLine("Tracking: An instance of {0} was disconnected.",
obj.ToString());
}
}
下面的代码示例演示如何在服务器上实现此接口。The following code example shows how to implement this interface on a server.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Services;
using System.Security.Permissions;
public class Server
{
[SecurityPermission(SecurityAction.Demand)]
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);
}
}
下面的代码示例演示如何在上一个代码示例中为服务器的客户端实现此接口。The following code example shows how to implement this interface on a client for the server in the preceding code example.
using System;
using System.Diagnostics;
using System.Reflection;
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.");
}
}
下面的代码示例显示了服务器和客户端使用的远程对象。The following code example shows the remote object that is used by the server and the client.
using System;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
// 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 destructor was invoked.
TimeSpan elapsedTime =
new TimeSpan(DateTime.Now.Ticks - startTime.Ticks);
Console.WriteLine("Destructor invoked after " +
elapsedTime.ToString() + " seconds.");
}
public void Hello(string name)
{
// Print a simple message.
Console.WriteLine("Hello, " + name);
}
}
注解
使用注册的每个对象在 TrackingServices 当前中的对象或代理 AppDomain 被封送、取消封送或断开连接时调用。Every object that is registered with TrackingServices is called by remoting when an object or proxy in the current AppDomain is marshaled, unmarshaled, or disconnected.
请注意,只能断开对象的连接。Note that only objects can be disconnected. 如果在代理上调用了断开连接,则会引发异常。An exception is thrown when disconnect is called on a proxy.
备注
此接口可进行链接请求。This interface makes a link demand. 如果直接调用方通过对接口的引用进行调用,且没有基础结构权限,则会引发 SecurityException。A SecurityException is thrown if the immediate caller makes the call through a reference to the interface and does not have infrastructure permission. 有关详细信息,请参阅 链接要求 。See Link Demands for more information.
方法
| DisconnectedObject(Object) |
通知当前实例某个对象已与其代理断开连接。Notifies the current instance that an object has been disconnected from its proxy. |
| MarshaledObject(Object, ObjRef) |
通知当前实例已封送对象。Notifies the current instance that an object has been marshaled. |
| UnmarshaledObject(Object, ObjRef) |
通知当前实例已将对象取消封送。Notifies the current instance that an object has been unmarshaled. |