.NET Remoting 的追踪服务使我们可以获取由远程结构发出的有关对象与代理的行为通知。追踪服务是可插入的,我们可以将一个或多个自定义跟踪处理程序注册到追踪服务中,当发生封送、取消封送或断开当前 AppDomain 中的对象或代理时,注册到中的每个追踪处理程序都将被远程处理调用。
创建自定义追踪处理程序很简单,实现 ITrackingHandler 接口,然后调用 TrackingServices.RegisterTrackingHandler() 将其实例注册到跟踪服务即可。追踪服务一般用于日志记录和调试。TrackingServices 实用类还可以注销(TrackingServices.UnregisterTrackingHandler)追踪处理程序,或查询(TrackingServices.RegisteredHandlers)所有的已注册追踪处理程序。
输出:
Unmarshaled: System.AppDomain. HashCode: 12036987
Unmarshaled: System.AppDomain. HashCode: 12036987
Unmarshaled: System.AppDomain. HashCode: 12036987
Marshaled: Learn.Library.Remoting.Data. HashCode: 38583594
Test AppDomain:server
Disconnected: Learn.Library.Remoting.Data. HashCode: 38583594
创建自定义追踪处理程序很简单,实现 ITrackingHandler 接口,然后调用 TrackingServices.RegisterTrackingHandler() 将其实例注册到跟踪服务即可。追踪服务一般用于日志记录和调试。TrackingServices 实用类还可以注销(TrackingServices.UnregisterTrackingHandler)追踪处理程序,或查询(TrackingServices.RegisteredHandlers)所有的已注册追踪处理程序。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.IO;
using System.Security.Permissions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Services;
namespace Learn.Library.Remoting
{
/// <summary>
/// 追踪服务
/// </summary>
public class TrackingHandler : ITrackingHandler
{
public void MarshaledObject(Object obj, ObjRef or)
{
Console.WriteLine("Marshaled: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
private void DumpChannelInfo(IChannelInfo info)
{
}
public void UnmarshaledObject(Object obj, ObjRef or)
{
Console.WriteLine("Unmarshaled: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
public void DisconnectedObject(Object obj)
{
Console.WriteLine("Disconnected: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
}
/// <summary>
/// 远程类型
/// </summary>
public class Data : MarshalByRefObject
{
public void Test()
{
Console.WriteLine("Test AppDomain:{0}", AppDomain.CurrentDomain.FriendlyName);
}
}
public class RemotingTest2
{
/// <summary>
/// 服务器端代码
/// </summary>
static void Server()
{
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate
{
LifetimeServices.LeaseTime = TimeSpan.FromSeconds(1);
LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(1);
LifetimeServices.SponsorshipTimeout = TimeSpan.FromSeconds(1);
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(1);
// 注册追踪服务
TrackingServices.RegisterTrackingHandler(new TrackingHandler());
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Data), "data", WellKnownObjectMode.Singleton);
});
}
/// <summary>
/// 客户端代码
/// </summary>
static void Client()
{
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownClientType(typeof(Data), "tcp://localhost:801/data");
Data data = new Data();
data.Test();
}
public static void Execute()
{
Server();
Client();
}
}
}
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.IO;
using System.Security.Permissions;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.CompilerServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Lifetime;
using System.Runtime.Remoting.Services;
namespace Learn.Library.Remoting
{
/// <summary>
/// 追踪服务
/// </summary>
public class TrackingHandler : ITrackingHandler
{
public void MarshaledObject(Object obj, ObjRef or)
{
Console.WriteLine("Marshaled: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
private void DumpChannelInfo(IChannelInfo info)
{
}
public void UnmarshaledObject(Object obj, ObjRef or)
{
Console.WriteLine("Unmarshaled: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
public void DisconnectedObject(Object obj)
{
Console.WriteLine("Disconnected: {0}. HashCode: {1}", obj.GetType(), obj.GetHashCode());
}
}
/// <summary>
/// 远程类型
/// </summary>
public class Data : MarshalByRefObject
{
public void Test()
{
Console.WriteLine("Test AppDomain:{0}", AppDomain.CurrentDomain.FriendlyName);
}
}
public class RemotingTest2
{
/// <summary>
/// 服务器端代码
/// </summary>
static void Server()
{
AppDomain server = AppDomain.CreateDomain("server");
server.DoCallBack(delegate
{
LifetimeServices.LeaseTime = TimeSpan.FromSeconds(1);
LifetimeServices.RenewOnCallTime = TimeSpan.FromSeconds(1);
LifetimeServices.SponsorshipTimeout = TimeSpan.FromSeconds(1);
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(1);
// 注册追踪服务
TrackingServices.RegisterTrackingHandler(new TrackingHandler());
TcpServerChannel channel = new TcpServerChannel(801);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Data), "data", WellKnownObjectMode.Singleton);
});
}
/// <summary>
/// 客户端代码
/// </summary>
static void Client()
{
TcpClientChannel channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownClientType(typeof(Data), "tcp://localhost:801/data");
Data data = new Data();
data.Test();
}
public static void Execute()
{
Server();
Client();
}
}
}
输出:
Unmarshaled: System.AppDomain. HashCode: 12036987
Unmarshaled: System.AppDomain. HashCode: 12036987
Unmarshaled: System.AppDomain. HashCode: 12036987
Marshaled: Learn.Library.Remoting.Data. HashCode: 38583594
Test AppDomain:server
Disconnected: Learn.Library.Remoting.Data. HashCode: 38583594