Каркас удаленного взаимодействия .NET
Когда клиенты и серверы обмениваются информацией через границы приложений, среда CLR вынуждена использовать низкоуровневые примитивы, обеспечивающие настолько "прозрачное" взаимодействие сторон, насколько это возможно. Это значит, что вам, как программисту .NET, не нужно создавать огромные по объему блоки программного кода поддержки сетевого соединения, чтобы вызвать метод удаленного объекта. Также и серверному процессу
В сущности, слой удаленного взаимодействия .NET обеспечивает аккуратную совместную работу следующих четырех ключевых элементов:
• агенты;
• сообщения;
• каналы;
• форматтеры.
Давайте рассмотрим каждый из указанных элементов по очереди и выясним, как их комбинация позволяет осуществлять удаленные вызовы методов.
Агенты и сообщения
Клиенты и объекты сервера взаимодействуют не напрямую, а через посредника, обычно называемого агентом (или proxy-модулем). Роль агента .NET заключается в создании для клиента иллюзии того, что он взаимодействует с запрошенным удаленным объектом
Формально такой агент, вызываемый клиентом непосредственно, называется
В предположении о том, что прозрачный агент может выполнять проверку входных аргументов, соответствующая информация упаковывается в другой генерируемый средой CLR тип, который называется
public interface IMessage {
IDictionary Properties { get; }
}
Как видите, интерфейс IMessage определяет единственное свойство (с именем Properties), которое обеспечивает доступ к коллекции, используемой для хранения предоставленных клиентом аргументов. После наполнения объекта сообщения содержимым средой CLR, он будет передан родственному типу, называемому
Реальный, агент – это сущность, которая фактически посылает объект сообщения в канал (понятие канала будет обсуждаться ниже). Реальный агент, который (в отличие от прозрачного агента)
public abstract class RealProxy: object {
public virtual ObjRef CreateObjRef(Type requestedType);
publiс virtual bool Equals(object obj);
public virtual IntPtr GetCOMIUnknown(bool fIsMarshalled);
public virtual int GetHashCode();
public virtual void GetObjectData(SerializationInfo info, StreamingContext context);
public Type GetProxiedType();
public static object GetStubData(RеаlРrоxу rp);
public virtual object GetTransparentProxy();
public Type GetType();
public IConstructionReturnMessage InitializeServerObject(IConstructionCallMessage ctorMsg);
public virtual IMessage Invoke(IMessage msg);
public virtual void SetCOMIUnknown(IntPtr i);