Книга: C# для профессионалов. Том II

Отслеживание служб

Отслеживание служб

Отладку и поиск неисправностей в приложениях, использующих .NET, можно проводить через службы удаленного отслеживания. Класс System.Runtime.Remoting.Services.TrackingService предоставляет службу слежения для получения информации о том, когда происходит маршализация и демаршализация, когда вызываются удаленные объекты и разъединяются и т. д.

? С помощью служебного класса TrackingServices регистрируется и отменяется регистрация обработчика, который реализует ITrackingHandler.

? Интерфейс ITrackingHandler вызывается, когда на удаленном объекте или на прокси происходит событие. Можно реализовать три метода в обработчике: MarshaledObject(), UnmarshaledObject() и DisconnectedObject().

Чтобы увидеть службы слежения в действии на клиенте и на сервере, создадим новую библиотеку классов TrackingHandler. Класс TrackingHandler реализует интерфейс ITrackingHandler. В методах задаются два аргумента: сам объект и ObjRef. С помощью ObjRef выдается информация об URI, канале и уполномоченных приемниках. Можно также присоединить новые приемники для добавления спонсоров всех вызываемых методов. В данном примере на консоль записывается URI и информация о канале.

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

namespace Wrox.ProfessionalCSharp (
 public class TrackingHandler : ITrackingHandler {
  public TrackingHandler() {
  }
  public void MarshaledObject(object obj, ObjRef or) {
   Console.WriteLine("--- Marshaled Object " + obj.GetType() + " ---");
   Console.WriteLine("Object URI: " + or.URI);
   object[] ChannelData = or.ChannelInfo.ChannelData;
   foreach(object data in ChannelData) {
    ChannelDataStore dataStore = data as ChannelDataStore;
    if (dataStore != null) {
     foreach (string uri in dataStore.ChannelUris) {
      Console.WriteLine("Channel URI: " + uri);
     }
    }
}
   Console.WriteLine("---------");
   Console.WriteLine();
  }
  public void UnmarshaledObject(object obj, ObjRef or) {
   Console.WriteLine("Unmarshal");
   public void DisconnectedObject(Object obj) {
   Console.WriteLine("Disconnect");
  }
 }
}

Серверная программа изменяется, чтобы регистрировать TrackingHandler. Необходимо добавить только две строки, чтобы зарегистрировать обработчик.

using System.Runtime.Remoting.Services;
// ...
public static void Main(string[] args) {
 TrackingServices.RegisterTrackingHandler(new TrackingHandler());
 TCPChannel channel = new TCPChannel(8086);
 // ...

При запуске сервера первый экземпляр создается во время регистрации хорошо известного типа, и мы получаем следующий вывод. Вызывается MarshaledObject() и выводит тип объекта для маршализации — Wrox.ProfessionalCSharp.Hello. С помощью Object URI мы видим GUID, который, используется внутренне в удаленной среде выполнения для различения определенных экземпляров и URI. С помощью канала URI можно проверить конфигурацию канала. В этом случае именем хоста будет Cnagel:


Оглавление книги


Генерация: 2.469. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз