[Remoting] 十:追踪服务

.NET Remoting 的追踪服务使我们可以获取由远程结构发出的有关对象与代理的行为通知。追踪服务是可插入的,我们可以将一个或多个自定义跟踪处理程序注册到追踪服务中,当发生封送、取消封送或断开当前 AppDomain 中的对象或代理时,注册到中的每个追踪处理程序都将被远程处理调用。

创建自定义追踪处理程序很简单,实现 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();
    }
  }
}

输出:
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  
 

转载于:https://www.cnblogs.com/leonardleonard/archive/2007/03/19/1928404.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值