удаленных объектов в ASF.NET поддерживает только хорошо известные объекты.
Классы, интерфейсы и SOAPSuds
В клиент/серверных примерах, которые были выполнены до сих пор, мы всегда ссылались на удаленные объекты в клиентском приложении. В этом случае копируется код CIL удаленного объекта, хотя нужны только метаданные. Также невозможно, чтобы клиент и сервер программировались независимо. Значительно лучшим способом является использование вместо этого интерфейсов или утилиты
SoapSuds.exe
.
Интерфейсы
Мы имеем четкое разделение клиентского и серверного кода с помощью интерфейсов. Интерфейс просто определяет методы без реализации. Мы отделяем контакт между клиентом и серверов от реализации. Вот необходимые шаги для использование интерфейса:
1. Определить интерфейс, который будет помещен в сборку.
2. Реализовать интерфейс в классе удаленного объекта. Чтобы сделать это, необходимо сослаться на сборку интерфейса.
3. На серверной стороне не требуется больше никаких изменений. Сервер можно программировать и конфигурировать обычным образом.
4. На клиентской стороне сошлитесь на сборку интерфейса вместо сборки удаленного объекта.
5. Клиент может теперь использовать интерфейс удаленного объекта, а не класс удаленного объекта. Объект можно создать с помощью класса
Activator
, как это делалось ранее. Нельзя при этом использовать
new
, так как невозможно создать экземпляр самого интерфейса.
Интерфейс определяет контракт между клиентом и сервером. Два приложения могут теперь разрабатываться независимо друг от друга. Если при этом придерживаться старых правил COM об интерфейсах (что интерфейсы никогда не должны меняться), то не будет никаких проблем с версиями.
SOAPSuds
Можно также использовать утилиту
soapsuds
, чтобы получить метаданные из сборки,
soapsuds
преобразовывает сборки в XML Schemas, XML Schemas для погружения классов и другие директивы.
Следующая команда преобразует тип
Hello
из сборки
RemoteHello.dll
в сборку
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) {