Опубликован: 18.09.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 13:

Компонентные технологии разработки web-приложений

Связь

Связь между компонентами в рамках .NET осуществляется при помощи механизма Remoting, реализующего как RMI, так и асинхронную передачу сообщений.

Классы и интерфейсы, служащие основой механизма Remoting, находятся в пространстве имен System.Runtime.Remoting и его подпространствах, в сборках mscorlib и System.Rutime.Remoting.

В рамках Remoting объекты, которые могут участвовать в качестве целей удаленного вызова, его параметров и результатов, делятся на передаваемые по значению (marshal-by-value) и передаваемые по ссылке (marshal-by-reference).

Тип объекта, передаваемого по значению, должен реализовывать интерфейс System.Runtime.Serialization.ISerializable или должен быть помечен атрибутом System.SerializableAttribute. В последнем случае .NET автоматически создает код, необходимый для сериализации или десериализации данных объекта. Исключения, которые могут быть созданы методом, вызываемым удаленно, также должны быть передаваемы по значению.

Объекты, передаваемые по ссылке, должны наследовать классу System.MarshalByRefObject. При передаче такого объекта как аргумента или результата в другом процессе (или зоне приложения, см. следующий раздел) создается клиентская заглушка, связанная с этим объектом и называемая в .NET посредником (proxy).

Более тонкую настройку удаленных вызовов можно делать при помощи наследников класса System.ContextBoundObject. Наследование этого класса говорит о том, что удаленные вызовы в объекте этого класса должны происходить в рамках некоторого контекста, являющегося частью его зоны приложения. Примером такого контекста служит контекст транзакции. При вызовах таких объектов .NET проводит дополнительные проверки, связанные с разницей контекстов между вызывающим объектом и вызываемым.

Ниже находится пример взаимодействующих по механизму Remoting классов, имеющий ту же функциональность, что и пример, приведенный для Java RMI.

Код класса, реализующего метод для удаленных обращений.

using System;

namespace Examples.Remoting
{
  public class Hello : MarshalByRefObject
  {
    public String HelloMethod() { return "Hello!"; }
  }
}

Код сервера, ожидающего обращения клиентов.

using System;
using System.Runtime.Remoting;

namespace Examples.Remoting
{
  public class HelloImpl
  {
    public static void Main()
    {
      RemotingConfiguration.Configure("RemotingServer.exe.config");
      Console.ReadLine();
    }
  }
}

Код клиентского класса.

using System;
using System.Runtime.Remoting;

namespace Examples.Remoting
{
  public class HelloClient
  {
    public static void Main()
    {
      RemotingConfiguration.Configure("RemotingClient.exe.config");
      Hello stub = new Hello();
      Console.WriteLine("response: " + stub.HelloMethod());
    }
  }
}

Кроме классов, должны быть написаны конфигурационные файлы серверного и клиентского приложений. Конфигурационный файл сервера выглядит так.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown 
          mode = "Singleton"
          type = "Examples.Remoting.Hello, Hello"
          objectUri = "MessageServer"
        />
      </service>
      <channels>
        <channel ref = "http" port = "8989" />
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>
Конфигурационный файл клиента.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown 
          type = "Examples.Remoting.Hello, Hello"
          url = "http://hostname:8989/MessageServer" 
        />
        </client>
    </application>
  </system.runtime.remoting>
</configuration>
13.3.

Чтобы запустить этот пример, нужно выполнить следующие шаги.

  • Скомпилировать все классы (предполагается, что классы находятся в файлах с именами Hello.cs, Server.cs и Client.cs).
    csc.exe /noconfig /t:library Hello.cs
    csc.exe /noconfig /r:Hello.dll Server.cs
    csc.exe /noconfig /r:Hello.dll Client.cs

    В результате первой команды будет получена динамическая библиотека, содержащая определение класса Hello. В двух других она используется, чтобы предоставить ссылку на этот тип.

  • Запустить серверный компонент
    Server.exe
  • Перенести на другую машину или в отдельную директорию на той же машине файлы Client.exe, Hello.dll, RemotingClient.exe.config, заменив hostname в URL в конфигурационном файле клиента на имя машины, где работает сервер, и запустить клиентский компонент
    Client.exe

    Если никаких ошибок не сделано, и порт 8989 на серверной машине доступен, клиент выдаст сообщение.

    response: Hello!

С помощью конфигурационных файлов можно определить политику активации серверного объекта (использовать один объект для всех вызовов, создавать для каждого вызова свой объект, создавать объект при его создании клиентом), транспортный протокол для передачи сообщений (HTTP или TCP), и пр.

Асинхронное взаимодействие в рамках .NET может быть реализовано с помощью имеющихся в библиотеке .NET асинхронных делегатов, на основе асинхронных удаленных вызовов по Remoting или с помощью обмена сообщениями на базе библиотек System.Messaging.

Взаимодействие между компонентами ASP.NET использует похожие, но скрытые от разработчика компонентов механизмы.

Именование

В примере на взаимодействие по Remoting использовалась локальная служба именования, встроенная в среду .NET — поэтому никаких специальных действий по регистрации и поиску компонентов не производилось. Эта служба позволяет не заботиться об этих вопросах в том случае, если физическое положение компонентов, с которыми необходимо установить связь, известно и постоянно.

Если же это не так, необходимо иметь полноценную службу именования и/или службу каталогов. В этом качестве в .NET используется Active Directory. Поскольку эта технология появилась раньше, чем среда .NET, в рамках .NET была создана библиотека адаптеров, позволяющих использовать функции Active Directory. Элементы этой библиотеки находятся в пространстве имен System.DirectoryServices и его подпространствах, в сборках System.DirectoryServices и System.DirectoryServices.Protocols.

Для работы с записями Active Directory используются объекты класса System.DirectoryServices.DirectoryEntry. C помощью конструкторов и методов этого класса можно создавать и изменять регистрационные записи службы каталогов. Для поиска зарегистрированных объектов по идентификаторам или свойствам используются методы класса System.DirectoryServices.DirectorySearcher.

Active Directory поддерживает обращения к своим записям по нескольким разным протоколам, включая протокол LDAP.

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Денис Сафронов
Денис Сафронов
Россия
жылдыз насырбекова
жылдыз насырбекова
Киргизия, бишкек