объекта. Объект можно создать с помощью класса 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();