Руководство. Предоставление локальной службы WCF на базе REST для внешнего клиента с помощью Ретранслятора WCF Azure

В этом руководстве описывается, как создать клиентское приложение ретранслятора WCF и службу с помощью Ретранслятора Azure. Как и в WCF, под службой понимается конструкция, которая предоставляет одну или несколько конечных точек. Каждая конечная точка предоставляет одну или несколько операций службы. Конечная точка службы указывает адрес , по которому можно найти службу, привязку , содержащую сведения, которые клиент должен связать со службой, и контракт , определяющий функциональные возможности, предоставляемые службой ее клиентам. Основное отличие между WCF и ретранслятором WCF состоит в том, что в последнем конечная точка размещается в облаке, а не на локальном компьютере.

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

В этом учебнике вы выполните следующие задачи:

  • Установка обязательных компонентов для работы с этим учебником.
  • Создание пространства имен ретранслятора.
  • Создание контракта службы WCF.
  • Реализация контракта WCF.
  • Размещение и запуск службы WCF для регистрации в службе ретрансляции.
  • Создание клиента WCF для контракта службы.
  • Настройка клиента WCF.
  • Реализация клиента WCF.
  • Запуск приложений.

Предварительные требования

Для работы с данным руководством вам потребуется:

Создание пространства имен ретранслятора

Сначала необходимо создать пространство имен и получить ключ подписанного URL-адреса (SAS). Пространство имен определяет границы каждого приложения, предоставляемого через службу ретрансляции. Ключ SAS автоматически создается системой при создании пространства имен службы. Сочетание пространства имен и ключа SAS образует учетные данные, на основе которых Azure осуществляет аутентификацию доступа к приложению.

  1. Войдите на портал Azure.

  2. В меню слева выберите Все службы. Выберите Интеграция, найдите Ретрансляторы, наведите указатель мыши на ретрансляторы, а затем выберите Создать.

    Снимок экрана: выбор кнопки

  3. На странице Создание пространства имен выполните следующие действия.

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Выберите существующую группу ресурсов, в которую будет размещено это пространство имен, или создайте новую.

    3. Введите имя для пространства имен ретранслятора.

    4. Выберите регион, в котором должно размещаться пространство имен.

    5. В нижней части страницы выберите Review + create (Проверить и создать).

      Снимок экрана: страница

    6. На странице Проверка и создание нажмите кнопку Создать.

    7. Через несколько минут вы увидите страницу Ретранслятор для пространства имен.

      Снимок экрана: домашняя страница пространства имен ретранслятора.

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

  1. На странице Ретранслятор выберите Политики общего доступа в меню слева. `

  2. На странице Политики общего доступа щелкните RootManageSharedAccessKey.

  3. В разделе SAS Policy: RootManageSharedAccessKey (Политика SAS: RootManageSharedAccessKey) нажмите кнопку Копировать рядом с элементом Первичная строка подключения. Строка подключения будет скопирована в буфер обмена для дальнейшего использования. Вставьте на время эти значения в Блокноте или любом другом месте.

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

    Снимок экрана: сведения о подключении для пространства имен ретранслятора.

Определение контракта службы WCF

Контракт службы определяет, какие операции поддерживает служба. Операциями называются методы и функции веб-службы. Контракты создаются путем определения интерфейса C++, C# или Visual Basic. Каждый метод в интерфейсе соответствует определенной операции службы. К каждому интерфейсу должен быть применен атрибут ServiceContractAttribute, а к каждой операции— атрибут OperationContractAttribute. Если у метода в интерфейсе с атрибутом ServiceContractAttribute нет атрибута OperationContractAttribute, то этот метод не предоставляется. Код для выполнения задач приведен в примерах после описания последовательности действий. Подробное описание контрактов и служб см. в статье Designing and Implementing Services (Разработка и реализация служб).

Создание контракта ретранслятора с помощью интерфейса

  1. Запустите Microsoft Visual Studio от имени администратора. Для этого щелкните правой кнопкой мыши значок программы Visual Studio и выберите Запустить от имени администратора.

  2. В Visual Studio выберите Создать проект.

  3. В окне Создание проекта выберите Консольное приложение (.NET Framework) для C# и нажмите кнопку Далее.

  4. Присвойте проекту имя EchoService и нажмите Создать.

    Создание консольного приложения

  5. В обозревателе решений щелкните проект правой кнопкой мыши и выберите Управление пакетами NuGet. В окне Диспетчер пакетов NuGet нажмите Обзор и найдите элемент WindowsAzure.ServiceBus. Нажмите Установить и примите условия использования.

    Пакет служебной шины

    Этот пакет автоматически добавляет ссылки на библиотеки служебной шины и элемент WCF System.ServiceModel. System.ServiceModel — это пространство имен, которое предоставляет программный доступ к основным функциям WCF. Служебная шина использует множество объектов и атрибутов WCF для определения контрактов службы.

  6. Добавьте следующие инструкции using в начало файла Program.cs.

    using System.ServiceModel;
    using Microsoft.ServiceBus;
    
  7. Измените имя пространства имен с EchoService (имя по умолчанию) на Microsoft.ServiceBus.Samples.

    Важно!

    В этом руководстве используется пространство имен C# Microsoft.ServiceBus.Samples, которое относится к управляемому типу на основе контракта и используется в файле конфигурации на этапе настройки клиента WCF. При компиляции этого образца вы можете указать любое пространство имен. Но инструкции из учебника не будут применимы, если вы не измените соответствующим образом пространства имен контракта и службы в файле конфигурации приложения. В файле App.config должно быть указано то же самое пространство имен, что и в файлах C#.

  8. Сразу после объявления пространства имен Microsoft.ServiceBus.Samples, но внутри этого пространства, определите новый интерфейс IEchoContract и примените к нему атрибут ServiceContractAttribute со значением https://samples.microsoft.com/ServiceModel/Relay/. Вставьте приведенный ниже фрагмент кода после объявления пространства имен.

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
    }
    

    Значение пространства имен отличается от пространства имен, которое используется во всей области кода. Оно используется в качестве уникального идентификатора данного контракта. Явное указание пространства позволяет предотвратить добавление значение пространства имен по умолчанию к имени контракта.

    Примечание

    Как правило, пространство имен контракта службы содержит схему именования, которая включает сведения о версии. Включение сведений о версии в пространство имен контракта службы позволяет службам выносить значительные изменения в новый контракт службы с новым пространством имен и предоставлять к нему доступ через новую конечную точку. Таким образом, клиенты могут продолжать использовать старый контракт службы без обновлений. Сведения о версии могут включать дату и номер сборки. Дополнительные сведения см. в статье Управление версиями службы. Схема именования пространства имен контракта службы, используемая в этом учебнике, не включает сведения о версии.

  9. В интерфейсе IEchoContract объявите метод для отдельной операции, которую контракт IEchoContract предоставляет в интерфейсе. Затем примените атрибут OperationContractAttribute к методу, который требуется предоставить как часть общедоступного контракта ретранслятора WCF, следующим образом:

    [OperationContract]
    string Echo(string text);
    
  10. Сразу после определения интерфейса IEchoContract объявите канал, наследующий от интерфейсов IEchoContract и IClientChannel, как показано здесь:

    public interface IEchoChannel : IEchoContract, IClientChannel { }
    

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

  11. Нажмите Сборка>Собрать решение или нажмите клавиши CTRL+SHIFT+B, чтобы проверить правильность уже выполненных действий.

Пример контракта WCF

Ниже приведен код базового интерфейса, определяющего контракт ретранслятора WCF.

using System;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Теперь, когда интерфейс создан, можно его реализовать.

Реализация контракта WCF

Прежде чем создавать ретранслятор Azure, необходимо создать контракт с помощью интерфейса. Сведения о создании интерфейса см. в предыдущем разделе. Этот интерфейс мы реализуем в следующей процедуре. Эта задача включает создание класса с именем EchoService, который реализует пользовательский интерфейс IEchoContract. После реализации этого интерфейса необходимо настроить его в файле конфигурации App.config. Этот файл конфигурации содержит необходимые для приложения сведения. К ним относятся имя службы, имя контракта и тип протокола, используемого для взаимодействия со службой ретрансляции. Код для выполнения этих задач приведен в примере после описания процедуры. Более общие сведения о реализации контракта службы см. в этой статье.

  1. Создайте новый класс с именем EchoService сразу после определения интерфейса IEchoContract. Класс EchoService реализует интерфейс IEchoContract.

    class EchoService : IEchoContract
    {
    }
    

    Как и в случае с другими реализациями интерфейсов, определение можно реализовать в другом файле. В этом учебнике реализация включается в тот же файл, что и определение интерфейса и метод Main().

  2. Примените атрибут ServiceBehaviorAttribute к интерфейсу IEchoContract. Атрибут определяет имя службы и пространство имен. После этого класс EchoService будет выглядеть так:

    [ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class EchoService : IEchoContract
    {
    }
    
  3. Реализуйте метод Echo, определенный в интерфейсе IEchoContract, в классе EchoService.

    public string Echo(string text)
    {
        Console.WriteLine("Echoing: {0}", text);
        return text;
    }
    
  4. Нажмите Сборка>Собрать решение или нажмите клавиши CTRL+SHIFT+B.

Определение конфигурации узла службы

Файл конфигурации похож на файл конфигурации WCF. Он содержит имя службы, конечную точку и привязку. Конечной точкой называется расположение, которое Azure Relay предоставляет клиентам и узлам для взаимодействия друг с другом. Привязкой называется тип протокола, который используется для взаимодействия. Основное отличие заключается в том, что настроенная конечная точка службы ссылается на привязку NetTcpRelayBinding, которая не является частью .NET Framework. NetTcpRelayBinding — это одна из привязок, определяемых службой.

  1. В обозревателе решений дважды щелкните файл App.config, чтобы открыть его в редакторе Visual Studio.

  2. В элементе замените <appSettings> заполнители именем пространства имен Azure Relay и ключом SAS, скопированным на предыдущем шаге.

  3. Добавьте элемент <services> внутри тегов <system.serviceModel>. В отдельном файле конфигурации можно определить несколько приложений ретранслятора. Однако в данном учебнике определяется только одно приложение.

    <?xmlversion="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <services>
    
        </services>
      </system.serviceModel>
    </configuration>
    
  4. Добавьте элемент <service> в элемент <services> для определения имени службы.

    <service name="Microsoft.ServiceBus.Samples.EchoService">
    </service>
    
  5. Внутри элемента <service> определите расположение контракта конечной точки, а также тип привязки для нее.

    <endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding"/>
    

    Конечная точка определяет расположение, в котором клиент будет искать хост-приложение. Результаты этого шага потребуются позднее для создания универсального кода ресурса (URI), который предоставляет полный доступ к узлу через ретранслятор Azure. Привязка объявляет, что для обмена данными со службой ретрансляции используется протокол TCP.

  6. Нажмите Сборка>Собрать решение или нажмите клавиши CTRL+SHIFT+B, чтобы проверить правильность уже выполненных действий.

Пример реализации контракта службы

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

[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]

    class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }

Следующий код показывает базовый формат файла App.config, связанного с хостом службы.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Microsoft.ServiceBus.Samples.EchoService">
        <endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding" />
      </service>
    </services>
    <extensions>
      <bindingExtensions>
        <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Размещение и запуск службы WCF для регистрации в службе ретрансляции

В этом разделе описывается запуск службы ретрансляции Azure.

Создание учетных данных ретранслятора

  1. Создайте в Main() две переменные для хранения пространства имен и ключа SAS, которые считываются из окна консоли.

    Console.Write("Your Service Namespace: ");
    string serviceNamespace = Console.ReadLine();
    Console.Write("Your SAS key: ");
    string sasKey = Console.ReadLine();
    

    Ключ SAS потребуется позже для доступа к проекту. Пространство имен передается в качестве параметра в CreateServiceUri для создания универсального кода ресурса (URI) службы.

  2. С помощью объекта TransportClientEndpointBehavior объявите, что в качестве учетных данных будет использоваться ключ SAS. Добавьте следующий код сразу после кода, добавленного на предыдущем шаге:

    TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
    sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
    

Создание базового адреса для службы

Создайте экземпляр Uri для базового адреса службы после кода, который вы добавили в предыдущем разделе. Этот универсальный код ресурса (URI) указывает схему, пространство имен и путь к интерфейсу службы служебной шины.

Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

Значение sb является аббревиатурой для схемы служебной шины (Service Bus). Она указывает, что используется протокол TCP. Эта же схема была ранее задана в файле конфигурации с помощью привязки NetTcpRelayBinding.

В этом учебнике используется универсальный код ресурса (URI) sb://putServiceNamespaceHere.windows.net/EchoService.

Создание и настройка узла службы

  1. Там же в Main() установите режим подключения AutoDetect.

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
    

    Режим подключения описывает протокол, используемый службой для связи со службой ретрансляции (HTTP или TCP). Если используется значение по умолчанию (AutoDetect), то служба пытается подключиться к Azure Relay по протоколу TCP при его доступности или по протоколу HTTP в противном случае. Этот результат не влияет на протокол, который задается в службе для обмена данными с клиентами. Этот протокол определяется используемой привязкой. Например, служба может использовать привязку BasicHttpRelayBinding, которая указывает, что ее конечная точка связывается с клиентами по протоколу HTTP. Для той же службы можно задать привязку ConnectivityMode.AutoDetect, чтобы обмен данными с ретранслятором Azure осуществлялся по протоколу TCP.

  2. Создайте хост службы с помощью универсального кода ресурса (URI), созданного на предыдущем шаге.

    ServiceHost host = new ServiceHost(typeof(EchoService), address);
    

    Хост службы представляет собой объект WCF, который создает экземпляры службы. На этом шаге нужно передать тип службы, которую вы намерены создать (тип EchoService), и адрес, по которому служба должна быть доступна.

  3. В начало файла Program.cs добавьте ссылки на System.ServiceModel.Description и Microsoft.ServiceBus.Description.

    using System.ServiceModel.Description;
    using Microsoft.ServiceBus.Description;
    
  4. Включите в Main() общий доступ к конечной точке.

    IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
    

    Этот шаг информирует службу ретрансляции о том, что ваше приложение общедоступно и может быть обнаружено в веб-канале Atom для вашего проекта. Если для DiscoveryType задано значение private, клиент по-прежнему может получить доступ к службе. Однако она не будет отображаться в результатах поиска по пространству имен Relay. Клиенту потребуется знать путь к конечной точке.

  5. Примените учетные данные службы к конечным точкам службы, определенным в файле App.config.

    foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
    {
        endpoint.Behaviors.Add(serviceRegistrySettings);
        endpoint.Behaviors.Add(sasCredential);
    }
    

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

Открытие узла службы

  1. Там же в Main() добавьте следующую строку, чтобы открыть службу.

    host.Open();
    
  2. Сообщите пользователю о том, что служба работает, и объясните, как ее отключить.

    Console.WriteLine("Service address: " + address);
    Console.WriteLine("Press [Enter] to exit");
    Console.ReadLine();
    
  3. После завершения закройте узел службы.

    host.Close();
    
  4. Скомпилируйте проект, нажав клавиши CTRL+SHIFT+B.

Пример размещения службы в консольном приложении

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

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Description;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { };

    [ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;         

            Console.Write("Your Service Namespace: ");
            string serviceNamespace = Console.ReadLine();
            Console.Write("Your SAS key: ");
            string sasKey = Console.ReadLine();

           // Create the credentials object for the endpoint.
            TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
            sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);

            // Create the service URI based on the service namespace.
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

            // Create the service host reading the configuration.
            ServiceHost host = new ServiceHost(typeof(EchoService), address);

            // Create the ServiceRegistrySettings behavior for the endpoint.
            IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);

            // Add the Relay credentials to all endpoints specified in configuration.
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                endpoint.Behaviors.Add(serviceRegistrySettings);
                endpoint.Behaviors.Add(sasCredential);
            }

            // Open the service.
            host.Open();

            Console.WriteLine("Service address: " + address);
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            // Close the service.
            host.Close();
        }
    }
}

Создание клиента WCF для контракта службы

Следующей задачей будет создание клиентского приложения и определение контракта службы, который вы реализуете позже. Шаги этого процесса напоминают действия по созданию службы: определение контракта, изменение файла App.config, использование учетных данных для подключения к службе ретрансляции и т. д. Код для выполнения этих задач приведен в примере после описания последовательности выполнения действий.

  1. Создайте в текущем решении Visual Studio новый проект для клиента, выполнив следующие действия.

    1. В обозревателе решений щелкните правой кнопкой мыши текущее решение (а не проект) и выберите Добавить>Новый проект.
    2. В окне Добавить проект нажмите Консольное приложение (.NET Framework) для C# и нажмите кнопку Далее.
    3. Присвойте проекту имя EchoClient и нажмите Создать.
  2. В обозревателе решений дважды щелкните файл Program.cs в проекте EchoClient, чтобы открыть его в редакторе (если он еще не открыт).

  3. Измените имя пространства имен с EchoClient (имя по умолчанию) на Microsoft.ServiceBus.Samples.

  4. Установите пакет NuGet для служебной шины.

    1. В обозревателе решений щелкните правой кнопкой мыши проект EchoClient и нажмите Управление пакетами NuGet.

    2. Нажмите Обзор и найдите WindowsAzure.ServiceBus. Нажмите Установить и примите условия использования.

      Установка пакета служебной шины

  5. Добавьте в файл Program.cs инструкцию using для пространства имен System.ServiceModel.

    using System.ServiceModel;
    
  6. Добавьте определение контракта службы в пространство имен, как показано в следующем примере. Это определение идентично определению в проекте Service. Добавьте этот код в верхнюю часть пространства имен Microsoft.ServiceBus.Samples.

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        string Echo(string text);
    }
    
    public interface IEchoChannel : IEchoContract, IClientChannel { }
    
  7. Чтобы собрать клиент, нажмите клавиши CTRL+SHIFT+B.

Пример проекта EchoClient

В следующем коде показано текущее состояние файла Program.cs в проекте EchoClient.

using System;
using Microsoft.ServiceBus;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        string Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }


    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Настройка клиента WCF

На этом шаге вы создадите файл конфигурации App.config для базового клиентского приложения, которое обращается к службе, созданной ранее в этом учебнике. Файл App.config определяет контракт, привязку и имя конечной точки. Код для выполнения этих задач приведен в примере после описания последовательности выполнения действий.

  1. В обозревателе решений в проекте EchoClient дважды щелкните App.config, чтобы открыть файл в редакторе Visual Studio.

  2. В элементе <appSettings> замените местозаполнители именем пространства имен службы и ключом SAS, скопированным на предыдущем шаге.

  3. В элемент system.serviceModel добавьте элемент <client>.

    <?xmlversion="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <client>
        </client>
      </system.serviceModel>
    </configuration>
    

    Этот код объявляет, что вы определяете клиентское приложение в стиле WCF.

  4. Определите имя, контракт и тип привязки для конечной точки в элементе client.

    <endpoint name="RelayEndpoint"
                    contract="Microsoft.ServiceBus.Samples.IEchoContract"
                    binding="netTcpRelayBinding"/>
    

    Этот код определяет имя конечной точки. Также он определяет определенный в службе контракт и факт использования протокола TCP клиентским приложением для взаимодействия с Azure Relay. На следующем шаге имя конечной точки используется для связывания ее конфигурации с универсальным кодом ресурса (URI) службы.

  5. Нажмите Файл>Сохранить все.

Пример файла App.config

В следующем коде показан файл App.config для клиента Echo.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint name="RelayEndpoint"
                      contract="Microsoft.ServiceBus.Samples.IEchoContract"
                      binding="netTcpRelayBinding"/>
    </client>
    <extensions>
      <bindingExtensions>
        <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Реализация клиента WCF

В этом разделе вы реализуете базовое клиентское приложение, которое обращается к службе, которую вы создали ранее в этом учебнике. Для доступа к Azure Relay клиент выполняет операции, аналогичные операциям, выполняемым службой:

  • Задает режим подключения.
  • Создает универсальный код ресурса (URI) расположения хоста службы.
  • Определяет учетные данные для безопасного доступа.
  • Применяет учетные данные к подключению.
  • Открывает подключение.
  • Выполняет специфические задачи приложения.
  • Закрывает подключение.

Однако одно из основных различий заключается в том, что клиентское приложение использует канал для подключения к службе ретрансляции. Служба использует вызов ServiceHost. Код для выполнения этих задач приведен в примере после описания последовательности выполнения действий.

Реализация клиентского приложения

  1. Установите режим подключения AutoDetect. Добавьте следующий код в метод Main() приложения EchoClient.

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
    
  2. Определите переменные для хранения значений пространства имен службы и ключа SAS, которые считываются из консоли.

    Console.Write("Your Service Namespace: ");
    string serviceNamespace = Console.ReadLine();
    Console.Write("Your SAS Key: ");
    string sasKey = Console.ReadLine();
    
  3. Создайте универсальный код ресурса (URI), определяющий расположение узла в проекте ретранслятора.

    Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
    
  4. Создайте объект учетных данных для конечной точки пространства имен службы.

    TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
    sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
    
  5. Создайте фабрику каналов, которая загружает описанную в файле App.config конфигурацию.

    ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));
    

    Фабрика каналов — это объект WCF, который создает канал взаимодействия между службой и клиентскими приложениями.

  6. Примените учетные данные.

    channelFactory.Endpoint.Behaviors.Add(sasCredential);
    
  7. Создайте и откройте канал к службе.

    IEchoChannel channel = channelFactory.CreateChannel();
    channel.Open();
    
  8. Напишите простой пользовательский интерфейс и функциональность для Echo.

    Console.WriteLine("Enter text to echo (or [Enter] to exit):");
    string input = Console.ReadLine();
    while (input != String.Empty)
    {
        try
        {
            Console.WriteLine("Server echoed: {0}", channel.Echo(input));
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
        input = Console.ReadLine();
    }
    

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

  9. Закройте канал и фабрику.

    channel.Close();
    channelFactory.Close();
    

Пример кода для этого учебника

Готовый код должен выглядеть так, как показано ниже. В этом коде показано, как создать клиентское приложение, как вызывать операции службы и как закрыть клиент после завершения вызова операции.

using System;
using Microsoft.ServiceBus;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;


            Console.Write("Your Service Namespace: ");
            string serviceNamespace = Console.ReadLine();
            Console.Write("Your SAS Key: ");
            string sasKey = Console.ReadLine();



            Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

            TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
            sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);

            ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));

            channelFactory.Endpoint.Behaviors.Add(sasCredential);

            IEchoChannel channel = channelFactory.CreateChannel();
            channel.Open();

            Console.WriteLine("Enter text to echo (or [Enter] to exit):");
            string input = Console.ReadLine();
            while (input != String.Empty)
            {
                try
                {
                    Console.WriteLine("Server echoed: {0}", channel.Echo(input));
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: " + e.Message);
                }
                input = Console.ReadLine();
            }

            channel.Close();
            channelFactory.Close();

        }
    }
}

Запуск приложений

  1. Чтобы выполнить сборку решения, нажмите клавиши CTRL+SHIFT+B. Это действие компилирует клиентский проект и проект службы, созданный на предыдущих этапах.

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

  3. На страницах свойств нажмите Общие свойства>Начальный проект, а затем выберите Несколько запускаемых проектов. Убедитесь, что проект EchoService отображается первым в списке.

  4. В поле Действие для проектов EchoService и EchoClient выберите значение Запуск.

    Страницы свойств проекта

  5. Нажмите Зависимости проекта. В разделе Проекты выберите EchoClient. Убедитесь, что в поле Зависит от указано значение EchoService.

    Зависимости проектов

  6. Нажмите ОК, чтобы закрыть страницы свойств.

  7. Нажмите клавишу F5, чтобы запустить оба проекта.

  8. Откроются два окна консоли с предложением указать пространство имен. Сначала нужно запустить службу, поэтому в окне консоли EchoService введите пространство имен и нажмите клавишу ВВОД.

  9. После этого консоль запросит у вас ключ SAS. Введите ключ SAS и нажмите клавишу ВВОД.

    Ниже приведен пример выходных данных из окна консоли. Эти значения являются просто примерами.

    Your Service Namespace: myNamespace

    Your SAS Key: <SAS key value>

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

    Service address: sb://mynamespace.servicebus.windows.net/EchoService/

    Press [Enter] to exit

  10. В окне консоли EchoClient введите данные, которые использовались для приложения службы. Введите те же значения пространства имен службы и ключа SAS для клиентского приложения.

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

    Enter text to echo (or [Enter] to exit):

    Введите текст для отправки в приложение службы и нажмите клавишу ВВОД. Этот текст отправляется службе посредством операции службы Echo и отображается в окне консоли службы, как показано ниже.

    Echoing: My sample text

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

    Server echoed: My sample text

  12. Вы можете отправить еще несколько текстовых сообщений от клиента к службе. Закончив, нажмите клавишу ВВОД в окнах консоли клиента и службы, чтобы завершить работу обоих приложений.

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

Перейдите к следующему руководству: