Тем не менее, чтобы упростить изложение материала этой главы, мы с вами построим и установим общие компоновочные блоки, содержащие как необходимые метаданные, так и CIL-код реализации.
Замечание.Чтобы выяснить, как реализовать общие компоновочные блоки в рамках указанных выше альтернативных подходов, прочитайте книгу Tom Barnaby, Distributed .NET Programming in C# (Apress, 2002).
Создание распределенного приложения
Ничто не принесет большей радости, чем создание реального распределенного приложения на новой платформе. Чтобы показать, как быстро можно создать и запустить приложение, использующее слой удаленного взаимодействия .NET, мы построим простой пример такого приложения. Выше уже отмечалось, что такое приложение должно состоять из трех компоновочных блоков .NET:
• общий компоновочный блок с именем SimpleRemotingAsm.dll;
• компоновочный блок клиента с именем SimpleRemoteObjectClient.exe;
• компоновочный блок сервера с именем SimpleRemoteObjectServer.exe.
Создание общего компоновочного блока
Сначала создадим общий компоновочный блок, SimpleRemotingAsm.dll, на который будут ссылаться как сервер, так и клиент. В SimpleRemotingAsm.dll определяется единственный MBR-тип с именем RemoteMessageObject, который поддерживает два открытых члена. Метод DisplayMessage() выводит в окно консоли сервера поставляемое клиентом сообщение, a ReturnMessage() возвращает некоторое сообщение клиенту. Вот полный программный код этой новой библиотеки классов C#.
namespace SimpleRemotingAsm {
// Для этого типа при удаленном доступе
// будет иcпользоваться маршалинг до ссылке (MBR).
public class RemoteMessageObject: MarshalByRefObject{
public RemoteMessageObject() { Console.WriteLine("Создание RemoteMessageObject!"); }
// Этот метод получает входную строку
// от вызывающей стороны.
public void DisplayMessage(string msg) { Console.WriteLine("Сообщение: {0}", msg); }
// Этот метод возвращает значение вызывающей стороне.
public string ReturnMessage() { return "Привет от сервера!"; }
}
}
Наиболее интересным здесь является то, что соответствующий тип получается из базового класса System.MarshalByRefObject, в результате чего полученный класс будет гарантированно доступным с помощью агента на стороне клиента. Также обратите внимание на пользовательский вариант конструктора, заданного по умолчанию, который печатает сообщение при создании экземпляра типа. Вот и все. Теперь можете создать новый компоновочный блок SimpleRemotingAsm.dll на базе этого программного кода.
Создание компоновочного блока сервера
Напомним, что компоновочные блоки сервера обслуживают, в частности, и общие компоновочные блоки, содержащие объекты удаленного доступа. Создайте консольную программу с именем SimpleRemoteObjectServer. Роль серверного компоновочного блока заключается в том, чтобы открыть канал для поступающих запросов и зарегистрировать RemoteMessageObjесt, как WKO-объект. Сначала сошлитесь на компоновочные блоки System.Runtime.Remoting.dll и SimpleRemotingAsm.dll и обновите Main() так, как предлагается ниже.
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using SimpleRemotingAsm;
namespace SimpleRemoteObjectServer {
class SimpleObjServer {
static void Main(string[] args) {
Console.WriteLine("*** Начало работы SimpleRemoteObjectServer! ***");
Console.WriteLine("Для завершения нажмите ‹Enter›");
// Регистрация нового HttpChannel
HttpChannel с = new HttpChannel(32469);
ChannelServices.RegisterChannel(c);
// Регистрация WKO-типа с активацией синглета.
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.soap", WellKnownObjectMode.Singleton);
Console.ReadLine();
}
}
}
Метод Main() начинается c создания нового типа HttpChannel, для которого указан произвольный идентификатор порта. Этот порт открывается путем регистрации канала с помощью статического метода ChannelServices.RegisterChannel(). После регистрации канала компоновочный блок удаленного сервера может обрабатывать сообщения, поступающие через порт с номером 32469.
Замечание.Номер, который вы назначите порту, как правило, выбираете вы сами (или ваш системный администратор). При этом, однако, следует учитывать то, что порты с номерами ниже 1024 резервируются для использования системой.
Затем, чтобы зарегистрировать тип SimpleRemotingAsm.RemoteMessageObject в качестве WKO-типа, используется метод RemotingConfiguration.RegisterWellKnownServiceType(). Первым аргументом этого метода является информация типа для регистрируемого типа. Вторым параметром RegisterWellKnownServiceТуре() является произвольная выбранная вами строка, которая будет использоваться для идентификации регистрируемого объекта при обмене данными между доменами приложений. Здесь вы информируете среду CLR о том, что данный объект должен распознаваться клиентом по имени RemoteMsgObj.soap.
Читать дальше