Чтение онлайн

ЖАНРЫ

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

Ватсон Карли

Шрифт:

<configuration>

 <system.runtime.remoting>

<application>

<client url="http:/localhost/RemoteHello">

<wellknown type="Wrox.ProfessionalCSharp.Hello, RemoteHello" url="http://localhost/RemoteHello/HelloService.soap" />

</client>

<channels>

<channel type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting" />

</channels>

</application>

 </system.runtime.remoting>

</configuration>

Хостинг

удаленных объектов в 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 -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;

}

public void UnmarshaledObject(object obj, ObjRef or) {

Console.WriteLine("Unmarshal");

public void DisconnectedObject(Object obj) {

Console.WriteLine("Disconnect");

}

 }

}

Серверная программа изменяется, чтобы регистрировать

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

Поделиться с друзьями: