Использование службы ретранслятора шины обслуживания (Service Bus Relay) в Windows Azure

В этом руководстве рассказывается об использовании службы ретранслятора шины обслуживания. Примеры написаны на языке C#, и в них используется интерфейс API Windows Communication Foundation и расширения, содержащиеся в сборке шины обслуживания из библиотеки .NET для Windows Azure. Дополнительные сведения о службе ретранслятора шины обслуживания см. в разделе «Дальнейшие действия».

Содержание

  • · Назначение службы ретранслятора шины обслуживания
  • · Создание пространства имен службы
  • · Получение заданных по умолчанию учетных данных для пространства имен
  • · Получение пакета шины обслуживания NuGet
  • · Инструкции: как задействовать шину обслуживания для реализации и использования веб-службы SOAP с TCP
  • · Дальнейшие действия

Назначение службы ретранслятора шины обслуживания

Служба ретранслятора шины обслуживания позволяет создавать гибридные приложения, выполняющиеся в центре обработки данных Windows Azure и локальной среде компании. Для этого служба ретранслятора шины обслуживания использует безопасное предоставление служб Windows Communication Foundation (WCF), находящихся в корпоративной сети, в общедоступное облако, не открывая соединение с брандмауэром и не внося изменения в сетевую инфраструктуру компании.

clip_image007

Шина обслуживания позволяет размещать службы WCF в среде компании. Затем этим службам можно делегировать прослушивание входящих сеансов и запросов к шине обслуживания на платформе Windows Azure. Таким образом, службы можно использовать в коде приложения на Windows Azure или в средах мобильных работников и внешних сетях партнеров. Шина обслуживания позволяет четко контролировать пользователей, обращающихся к этим службам. Она эффективно и надежно реализует функциональность приложения и данных из корпоративных решений и использует их преимущества при работе в облаке.

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

Создание пространства имен службы

Чтобы приступить к работе с ретранслятором шины обслуживания на платформе Windows Azure, необходимо создать пространство имен службы. Пространство имен службы предоставляет контейнер для использования ресурсов шины обслуживания в приложении.

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

Войдите на Портал управления Windows Azure. В левой нижней панели навигации портала управления щелкните Service Bus, Access Control & Caching.

В левой верхней панели портала управления щелкните узел Service Bus, а затем нажмите кнопку New.

clip_image009

В диалоговом окне Create a new Service Namespace введите значение в поле Namespace, а затем, чтобы убедиться в его уникальности, нажмите кнопку Check Availability.

clip_image011

После проверки доступности имени пространства имен выберите страну (регион), где следует разместить пространство имен (значение параметра Country/Region должно совпадать с названием страны (региона), где развертываются вычислительные ресурсы), а затем нажмите кнопку Create Namespace.

Созданное пространство имен появится на Портале управления, его активация займет несколько секунд. Перед выполнением дальнейших действий дождитесь смены состояния на Active.

Получение заданных по умолчанию учетных данных для пространства имен

Чтобы создать в новом пространстве имен подключение ретрансляции, необходимо получить учетные данные управления.

В левой панели навигации щелкните узел Service Bus, чтобы отобразить список доступных пространств имен.

clip_image009[1]

В списке выберите только что созданное пространство имен.

clip_image013

В области Properties в правой части будут выведены свойства нового пространства имен.

clip_image015

Свойство Default Key скрыто. Нажмите кнопку View, чтобы отобразить учетные данные для безопасного доступа.

clip_image017

Запомните значения Default Issuer и Default Key, поскольку они потребуются позднее при выполнении операций с пространством имен.

Получение пакета шины обслуживания NuGet

Использование пакета шины обслуживания NuGet — самый простой способ получить API шины обслуживания и настроить приложение со всеми ее зависимостями. Расширение NuGet Visual Studio упрощает установку и обновление библиотек и средств в Visual Studio и Visual Web Developer.

Чтобы установить пакет NuGet в приложении, выполните следующие действия.

В Solution Explorer щелкните правой кнопкой мыши References, а затем выберите команду Manage NuGet Packages. Выполните поиск WindowsAzure.ServiceBus и выберите элемент Windows Azure Service Bus. Нажмите кнопку Install, чтобы завершить установку, а затем закройте это диалоговое окно.

clip_image019

Как задействовать шину обслуживания для реализации и использования веб-службы SOAP с TCP

Чтобы предоставить веб-службу WCF SOAP для внешнего использования, необходимо изменить привязки и адреса службы. Для этого необходимо внести изменения в файл конфигурации или код, причем эти изменения зависят от настройки служб WCF. WCF допускает использование нескольких сетевых конечных точек для одной службы, поэтому можно сохранить существующие внутренние конечные точки и добавить конечные точки шины обслуживания для внешнего доступа.

В этом руководстве вы создадите простую службу WCF и добавите в нее прослушиватель шины обслуживания. Предполагается, что вы знакомы с Visual Studio 2010, поэтому ряд действий по созданию проекта опущен. Основное внимание здесь уделяется коду.

Прежде чем перейти к следующим действиям, выполните шаги по настройке среды.

В Visual Studio создайте консольное приложение, содержащее в решении два проекта — Client и Service. В качестве целевого фреймворка для обоих проектов выберите .NET Framework 4.

Добавьте пакет Windows Azure Service Bus NuGet в оба проекта. При этом будут добавлены все необходимые ссылки на сборки.

Создание службы

Сначала создайте саму службу. Каждая служба WCF состоит как минимум из трех частей:

  • определение контракта (описывает, обмен какими сообщениями происходит и какие операции будут вызваны);
  • реализация контракта;
  • узел, на котором размещена служба и который отображает количество конечных точек.

В примерах кода данного раздела рассматривается каждый компонент.

Контракт определяет одну операцию — AddNumbers, которая добавляет два числа и возвращает результат. Интерфейс IProblemSolverChannel позволяет клиенту легко управлять жизненным циклом прокси-сервера. Наличие такого интерфейса весьма полезно. Кроме того, рекомендуется сохранить определение контакта в отдельном файле, чтобы ссылаться на него из проектов Client и Service, или же можно скопировать код в оба проекта.

using System.ServiceModel;

[ServiceContract(Namespace = "urn:ps")]
interface IProblemSolver
{
    [OperationContract]
    int AddNumbers(int a, int b);
}

interface IProblemSolverChannel : IProblemSolver, IClientChannel {}

При наличии контракта выполнить реализацию совсем не сложно.

class ProblemSolver : IProblemSolver
{
    public int AddNumbers(int a, int b)
    {
        return a + b;
    }
}

Настройка узла службы программными средствами

При наличии контракта и реализации можно разместить службу. Размещение выполняется в объекте System.ServiceModel.ServiceHost, который управляет экземплярами службы и размещает конечные точки, прослушивающие сообщения. Приведенный ниже код используется для настройки службы с обычной локальной конечной точкой и конечной точкой шины обслуживания, он демонстрирует одновременное отображение внутренних и внешних конечных точек. Замените строку **namespace** именем пространства имен, а строку **key** — ключом издателя, которые были получены на шаге настройки выше.

ServiceHost sh = new ServiceHost(typeof(ProblemSolver));

sh.AddServiceEndpoint(
    typeof (IProblemSolver), new NetTcpBinding(),
    "net.tcp://localhost:9358/solver");

sh.AddServiceEndpoint(
    typeof(IProblemSolver), new NetTcpRelayBinding(),
    ServiceBusEnvironment.CreateServiceUri("sb", "**namespace**", "solver"))
    .Behaviors.Add(new TransportClientEndpointBehavior {
          TokenProvider = TokenProvider.CreateSharedSecretTokenProvider( "owner", "**key**")});

sh.Open();

Console.WriteLine("Press ENTER to close");
Console.ReadLine();

sh.Close();

В примере вы создадите две конечные точки, которые находятся в одной реализации контракта. Одна является локальной, а другая предоставляется через шину обслуживания. Они отличаются привязками: NetTcpBinding — для локальной конечной точки и NetTcpRelayBinding –– для конечной точки и адресов шины обслуживания. У локальной конечной точки есть локальный сетевой адрес с отдельным портом. Адрес конечной точки шины обслуживания состоит из строки sb, названия пространства имен и пути solver. В результате формируется URI вида sb://[пространство_имен_службы].servicebus.windows.net/solver, идентифицирующий конечную точку службы как конечную точку шины обслуживанияTCP с полным внешним DNS-именем. При вводе кода, заменяющего местозаполнители, в функцию Main приложения Service будет образована функциональная служба. Если нужно, чтобы служба прослушивала исключительно шину обслуживания, удалите определение локальной конечной точки.

Настройка узла службы в файле App.config

Для настройки узла воспользуйтесь файлом App.config. В этом случае код размещения службы будет выглядеть так:

ServiceHost sh = new ServiceHost(typeof(ProblemSolver));
sh.Open();
Console.WriteLine("Press ENTER to close");
Console.ReadLine();
sh.Close();

Определения конечных точек перемещаются в файл App.config. Обратите внимание, что пакет NuGet уже добавил диапазон определений в файл App.config. Эти определения являются необходимыми расширениями конфигурации для шины обслуживания. Следующий фрагмент кода, который точно совпадает с указанным выше кодом, должен появиться сразу же под элементом system.serviceModel. В этом фрагменте предполагается, что пространство имен проекта на C# называется Service. Замените местозаполнители названием пространства имен и ключом службы шины обслуживания .

<services>
    <service name="Service.ProblemSolver">
        <endpoint contract="Service.IProblemSolver"
                  binding="netTcpBinding"
                  address="net.tcp://localhost:9358/solver"/>
        <endpoint contract="Service.IProblemSolver"
                  binding="netTcpRelayBinding"
                  address="sb://**namespace**.servicebus.windows.net/solver"
                  behaviorConfiguration="sbTokenProvider"/>
    </service>
</services>
<behaviors>
    <endpointBehaviors>
        <behavior name="sbTokenProvider">
            <transportClientEndpointBehavior>
                <tokenProvider>
                    <sharedSecret issuerName="owner" issuerSecret="**key**" />
                </tokenProvider>
            </transportClientEndpointBehavior>
        </behavior>
    </endpointBehaviors>
</behaviors>

После внесения изменений служба запустится, как и прежде, однако в ней будут присутствовать две действующие конечные точки: одна локальная и одна выполняющая прослушивание в облаке.

Создание клиента. Настройка клиента программными средствами

Чтобы использовать службу, можно создать клиент WCF с помощью объекта ChannelFactory. Шина обслуживания применяет модель безопасности на основе утверждений, реализованную с помощью службы контроля доступа (ACS). Класс TokenProvider представляет поставщика маркера безопасности со встроенными заводскими методами, которые возвращают некоторых известных поставщиков маркеров. В примере ниже используется SharedSecretTokenProvider для сохранения учетных данных общего секрета и приобретения соответствующих маркеров из службы контроля доступа. Получение имени и ключа на портале было описано в предыдущем разделе.

Сначала укажите или скопируйте код контракта IProblemSolver из службы в проект клиента.

Затем замените код в методе Main клиента, вписав вместо текста местозаполнителя название пространства имен и ключ службы шины обслуживания.

var cf = new ChannelFactory<IProblemSolverChannel>(
    new NetTcpRelayBinding(),
    new EndpointAddress(ServiceBusEnvironment.CreateServiceUri("sb", "**namespace**", "solver")));

cf.Endpoint.Behaviors.Add(new TransportClientEndpointBehavior
            { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("owner","**key**") });

using (var ch = cf.CreateChannel())
{
    Console.WriteLine(ch.AddNumbers(4, 5));
}

Теперь можно скомпилировать клиент и службу и запустить их (сначала нужно запустить службу). Клиент вызовет службу и напечатает «9». Клиент и сервер можно запустить на разных компьютерах и даже в разных сетях, но их взаимодействие сохранится. Код клиента также можно выполнить в облаке или локально.

Настройка клиента в файле App.config

Для настройки клиента можно воспользоваться файлом App.config. Используется следующий код клиента.

var cf = new ChannelFactory<IProblemSolverChannel>("solver");
using (var ch = cf.CreateChannel())
{
    Console.WriteLine(ch.AddNumbers(4, 5));
}

Определения конечных точек перемещаются в файл App.config. Сразу же под элементом system.serviceModel должен появиться следующий фрагмент, аналогичный указанному выше коду. Здесь, как и ранее, местозаполнители следует заменить названием пространства имен и ключом службы шины обслуживания.

<client>
    <endpoint name="solver" contract="Service.IProblemSolver"
              binding="netTcpRelayBinding"
              address="sb://**namespace**.servicebus.windows.net/solver"
              behaviorConfiguration="sbTokenProvider"/>
</client>
<behaviors>
    <endpointBehaviors>
        <behavior name="sbTokenProvider">
            <transportClientEndpointBehavior>
                <tokenProvider>
                    <sharedSecret issuerName="owner" issuerSecret="**key**" />
                </tokenProvider>
            </transportClientEndpointBehavior>
        </behavior>
    </endpointBehaviors>
</behaviors>

Дальнейшие действия

Получив общие сведения о службе ретранслятора шины обслуживания, вы можете перейти по следующим ссылкам, чтобы ознакомиться с ней более подробно.