В настоящий момент ваш удаленный объект доступен через сетевой протокол HTTP. Как уже упоминалось выше, этот протокол вполне совместим с брандмауэром, но генерируемые при этом пакеты SOAP немного "раздуты" (по причине представления данных в формате XML). Чтобы уменьшить сетевой трафик, можно изменить компоновочные блоки клиента и сервера так, чтобы в них использовался TCP-канал и, следовательно, тип BinaryFormatter. Вот подходящая модификация компоновочного блока сервера.
Замечание. Для файлов с определениями объектов, доступных по TCP-каналам о заданным URI, чаще всего (но не обязательно) используется расширение *.rem (от remote – удаленный).
// Корректировки для сервера.
using System.Runtime.Remoting.Channels.Tcp;
…
static void Main(string[] args) {
…
// Создание нового TcpChannel
TcpChannel с = new TcpChannel(32469);
ChannelServises.RegisterChannel(c);
// Регистрация WKO-объекта в режиме синглета.
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.rem", WellKnownObjectMode.SingleCall);
Console.ReadLine;
}
Здесь в слое удаленного взаимодействия .NET регистрируется тип System. Runtime.Remoting.Channels.Tcp.TcpChannel. Кроме того, изменен URI-объект (теперь для него задано более общее имя RemoteMsgObj.rem вместо *.soap, что явно указывало на использование SOAP). Модификация приложения клиента так же проста.
// Корректировки для клиента.
using System.Runtime.Remoting.Channels.Тcр;
…
static void Main(string[] args) {
…
// Создание нового TcpChannel
TcpChannel с = new TcpChannel;
ChannelServices.RegisterChannel(c);
// Получение агента для удаленного объекта.
object remoteObj = Activator.GetObject(typeof(SimpleRemotingAsm.RemoteMessageObject), "tcp://localhost:32469/RemoteMsgObj.rem");
// Использование объекта.
RemoteMessageObject simple = (RemoteMessageObject)remoteObj;
simple.DisplayMessage("Привет от клиента!");
Console.WriteLine("Сервер говорит: {0}", simple.ReturnMessage);
Console.ReadLine;
}
Единственным заслуживающим внимания моментом здесь является то, что URL активизации клиента теперь должен содержать признак канала tcp://, а неВо всем остальном программная логика здесь оказывается идентичной программной логике HttpChannel,
Исходный код. Проекты TCPSimpleRemoteObjectServer и TCPSimpleRemoteObjectClient размещены в подкаталоге, соответствующем главе 18 (оба эти проекта используют созданный выше компоновочный блок SimpleRemotingAsm.dll).
Несколько слов о IpcChannel
Перед тем как перейти к обсуждению файлов конфигурации удаленного взаимодействия, напомним, что .NET 2.0 предлагает тип IpcChannel, обеспечивающий самый быстрый из возможных способов взаимодействия приложений
Файлы конфигурации удаленного взаимодействия
Итак, вы успешно построили распределённое приложение, используя слой удаленного взаимодействия .NET. В связи c данными примерами следует обратить внимание на то что полученные приложения клиента и сервера содержат большой объем "жестко" кодируемой программной логики. Например, сервер указывает фиксированный идентификатор порта, фиксированный режим активизации и фиксированный тип канала. Клиент, с другой стороны, "жестко" кодирует имя удаленного объекта, с которым пытается взаимодействовать.