объекта. Объект можно создать с помощью класса Activator, как это делалось ранее. Нельзя при этом использовать new, так как невозможно создать экземпляр самого интерфейса.
Интерфейс определяет контракт между клиентом и сервером. Два приложения могут теперь разрабатываться независимо друг от друга. Если при этом придерживаться старых правил COM об интерфейсах (что интерфейсы никогда не должны меняться), то не будет никаких проблем с версиями.
SOAPSuds
Можно также использовать утилиту soapsuds, чтобы получить метаданные из сборки, soapsuds преобразовывает сборки в XML Schemas, XML Schemas для погружения классов и другие директивы.
Следующая команда преобразует тип Hello из сборки RemoteHello.dll в сборку HelloWrapper.dll, где генерируется прозрачный прокси, который вызывает удаленный объект.
soapsuds -types:Wrox.ProfessionalCSharp.Hello, RemoteHello -oa:HelloWrapper.dll
С помощью soapsuds можно также получить информацию о типах непосредственно с выполняющегося сервера:
soapsuds -url:http://localhost:6792/hi -oa:HelloWrapper.dll
На клиенте теперь можно ссылаться вместо исходной сборки на созданную soapsuds сборку. Некоторые из возможностей перечислены в таблице.
| Параметр | Описание |
|---|---|
-url | Извлекает схему из указанного URL. |
-proxyurl | Если требуется прокси сервер для доступа к серверу, определите прокси с помощью этого параметра. |
-types | Определяет тип и сборку для чтения из нее информации о схеме. |
-is | Файл ввода схемы. |
-ia | Файл ввода сборки. |
-os | Файл вывода схемы. |
-oa | Файл вывода сборки. |
Отслеживание служб
Отладку и поиск неисправностей в приложениях, использующих .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();
