Всем привет ! Мы продолжаем знакомиться с технологией от Microsoft под названием App Fabric Service Bus. Данная публикация является уже второй по счету, посвященной этому механизму. В первой я напомню мы познакомились с определением и основными сценариями применения технологии, а также узнали как создать свой первый неймспейс. Посмотреть ее можно вот по этой ссылке: Введение в AppFabric Service Bus. Сценарии применения.Сегодня пост будет более техническим – попытаемся создать и использовать WCF-сервис посредством Service Bus.
Итак, задача стоит следующая: построить WCF-сервис, содержащий один единственный метод. Метод будет принимать строковый параметр и сразу же возвращать его клиенту. Захостить этот сервис постараемся на сервисной шине. То есть по факту Service Bus будет выступать как ретранслятор сообщений между клиентом и WCF-сервисом.Для решения поставленной задачи был создан новый солюшен со следующими проектами: EchoService.Client, EchoService.Server, EchoService.Source. В студии это выглядит следующим образом:
EchoService.Client представляет собой консольное приложение, через которое пользователь может отправлять сообщения на сервер. EchoService.Server – это наша серверная часть (также консольное приложение), на базе которой будет открываться WCF-хост, запускающий необходимый нам WCF-сервис. Так как и клиенту и серверу необходим контракт WCF-сервиса – мы поместили его в совместно используемую сборку под названием EchoService.Source. В данной сборке находится один единственный интерфейс, код которого представлен ниже.
Ничего необычного – стандартный интерфейс с одним единственным методом Echo, принимающий и возвращающий строковый параметр. В сборке EchoService.Server находится реализация данного интерфейса – это класс под названием EchoServer – его код также представлен чуть ниже.
Здесь также все стандартно – класс реализует интерфейс IEchoService и помечается атрибутом ServiceBehavior (тем самым класс помечается как реализация WCF-сервиса). Метод Echo помимо того, что возвращает пришедшую в параметре строку обратно клиенту, также выводит ее в консоль сервера. Основная же функциональность сервера заключена в файле Program.cs. Давайте посмотрим на его содержимое:
Давайте более подробно разберемся что же происходит. Итак, во-первых для запуска сервиса необходимы входные данные, а именно криденшалы для доступа к Service Bus и название неймспейса. Они то как раз и собираются в первых строчках программы. После этого создается уникальный всеобще доступный адрес сервиса (на выходе мы получим вот такого формата адрес: sb://<YOUR-NAMESPACE>.servicebus.windows.net/EchoService). Для доступа к Service Bus все клиенты должны быть аутентифицированными. В нашем случае используется так называемая аутентификация SharedSecret и происходит это следующем сегменте кода:
Данный способ аутентификации похож на стандартные схемы, при которых передается пара логин/пароль (кроме того поддерживаются следующие схемы аутентификации: Saml, SimpleWebToken и Unauthenticated). Ну и в конце концов при помощи стандартного инструментария из сборки System.ServiceModel.dll создается WCF-хост и запускается наш Echo-сервис (конечно же при этом для каждой точки доступа устанавливается созданное ранее поведение, гарантирующее возможность подключения лишь аутентифицированных пользователей).
Давайте теперь взглянем на исходный код клиента.
Алгоритм подключения к шине совершенно идентичный оному в серверной части. Различия заключаются лишь в том, что мы не открываем новый хост, а открываем канал при помощи вот этого кода:
Все, что нам осталось сделать это добавить пару строчек кода в конфигурационные файлы обоих проектов. В серверную часть добавим следующую конфигурацию:
В клиентскую же отправляется следующий фрагмент:
В обоих случаях указывается основная точка доступа к сервису и новый биндинг под названием netTcpRelayBinding (этот вид биндинга находится в сборке Microsoft.ServiceBus.dll и обеспечивает безопасную и надежную коммуникацию между компьютерами посредством Service Bus)
Все готово, осталось сделать лишь один маленький шаг перед запуском системы. А именно узнать на портале криденшалы для доступа (это наши Issuer Name и Issuer Secret, требуемые как клиентом так и сервером). Найти их можно в разделе AppFabric –> Service Bus в свойстве неймспейса под названием Default Key
По клику на кнопочке View откроется модальное окошко, в котором как раз и будут содержаться необходимые нам данные.
На этом все приготовления можно считать завершенными. Для демонстрации я покажу пару скриншотов ,показывающих функционирование системы.
Как видим система работает прекрасно, а для создания сервиса нам не пришлось прикладывать значительных усилий, большинство рутинной работы за нас выполняет новый WCF-биндинг, находящийся в пространстве имен Microsoft.ServiceBus.
На этом пост можно завершать. Исходные файлы проекта можно взять по следующей ссылке: AppFabric Service Bus Echo Service. Очень скоро мы познакомимся с более прогрессивными и изощренными вариантами применения Service Bus, а пока что спасибо за внимание, надеюсь публикация была полезна и интересна :)
Итак, задача стоит следующая: построить WCF-сервис, содержащий один единственный метод. Метод будет принимать строковый параметр и сразу же возвращать его клиенту. Захостить этот сервис постараемся на сервисной шине. То есть по факту Service Bus будет выступать как ретранслятор сообщений между клиентом и WCF-сервисом.Для решения поставленной задачи был создан новый солюшен со следующими проектами: EchoService.Client, EchoService.Server, EchoService.Source. В студии это выглядит следующим образом:
EchoService.Client представляет собой консольное приложение, через которое пользователь может отправлять сообщения на сервер. EchoService.Server – это наша серверная часть (также консольное приложение), на базе которой будет открываться WCF-хост, запускающий необходимый нам WCF-сервис. Так как и клиенту и серверу необходим контракт WCF-сервиса – мы поместили его в совместно используемую сборку под названием EchoService.Source. В данной сборке находится один единственный интерфейс, код которого представлен ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace EchoService.Source { [ServiceContract(Name = "EchoContract", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")] public interface IEchoContract { [OperationContract] string Echo(string message); } }
Ничего необычного – стандартный интерфейс с одним единственным методом Echo, принимающий и возвращающий строковый параметр. В сборке EchoService.Server находится реализация данного интерфейса – это класс под названием EchoServer – его код также представлен чуть ниже.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using EchoService.Source; using System.ServiceModel; namespace EchoService.Server { [ServiceBehavior(Name = "EchoService", Namespace = "http://samples.microsoft.com/ServiceModel/Relay/")] public class EchoServer : IEchoContract { public string Echo(string message) { Console.WriteLine("Received: {0}", message); return message; } } }
Здесь также все стандартно – класс реализует интерфейс IEchoService и помечается атрибутом ServiceBehavior (тем самым класс помечается как реализация WCF-сервиса). Метод Echo помимо того, что возвращает пришедшую в параметре строку обратно клиенту, также выводит ее в консоль сервера. Основная же функциональность сервера заключена в файле Program.cs. Давайте посмотрим на его содержимое:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using System.ServiceModel; using System.ServiceModel.Description; namespace EchoService.Server { class Program { static void Main(string[] args) { Console.Title = "Сервер"; Console.Write("Введите Service Bus неймспейс: "); string serviceNamespaceDomain = Console.ReadLine(); Console.Write("Issuer Name: "); string issuerName = Console.ReadLine(); Console.Write("Issuer Secret: "); string issuerSecret = Console.ReadLine(); Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespaceDomain, "EchoService"); TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(); sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret; ServiceHost host = new ServiceHost(typeof(EchoServer), address); IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public); foreach (ServiceEndpoint endpoint in host.Description.Endpoints) { endpoint.Behaviors.Add(sharedSecretServiceBusCredential); } host.Open(); Console.WriteLine("Адрес сервиса: " + address); Console.WriteLine("Нажмите [Enter] для выхода"); Console.ReadLine(); host.Close(); } } }
Давайте более подробно разберемся что же происходит. Итак, во-первых для запуска сервиса необходимы входные данные, а именно криденшалы для доступа к Service Bus и название неймспейса. Они то как раз и собираются в первых строчках программы. После этого создается уникальный всеобще доступный адрес сервиса (на выходе мы получим вот такого формата адрес: sb://<YOUR-NAMESPACE>.servicebus.windows.net/EchoService). Для доступа к Service Bus все клиенты должны быть аутентифицированными. В нашем случае используется так называемая аутентификация SharedSecret и происходит это следующем сегменте кода:
TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(); sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;
Данный способ аутентификации похож на стандартные схемы, при которых передается пара логин/пароль (кроме того поддерживаются следующие схемы аутентификации: Saml, SimpleWebToken и Unauthenticated). Ну и в конце концов при помощи стандартного инструментария из сборки System.ServiceModel.dll создается WCF-хост и запускается наш Echo-сервис (конечно же при этом для каждой точки доступа устанавливается созданное ранее поведение, гарантирующее возможность подключения лишь аутентифицированных пользователей).
Давайте теперь взглянем на исходный код клиента.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.ServiceBus; using System.ServiceModel; using EchoService.Source; namespace EchoService.Client { class Program { static void Main(string[] args) { Console.Title = "Клиент"; Console.Write("Введите Service Bus неймспейс: "); string serviceNamespaceDomain = Console.ReadLine(); Console.Write("Issuer Name: "); string issuerName = Console.ReadLine(); Console.Write("Issuer Secret: "); string issuerSecret = Console.ReadLine(); Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespaceDomain, "EchoService"); TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior(); sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName; sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret; ChannelFactory<IEchoContract> channelFactory = new ChannelFactory<IEchoContract>("RelayEndpoint", new EndpointAddress(serviceUri)); channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential); IEchoContract channel = channelFactory.CreateChannel(); ((ICommunicationObject)channel).Open(); Console.WriteLine("Введите текст для отправки на сервер:"); string input = Console.ReadLine(); while (!String.IsNullOrEmpty(input)) { try { Console.WriteLine("Сервер ответил: {0}", channel.Echo(input)); } catch (Exception e) { Console.WriteLine("Ошибка: " + e.Message); } input = Console.ReadLine(); } ((ICommunicationObject)channel).Close(); channelFactory.Close(); } } }
Алгоритм подключения к шине совершенно идентичный оному в серверной части. Различия заключаются лишь в том, что мы не открываем новый хост, а открываем канал при помощи вот этого кода:
ChannelFactory<IEchoContract> channelFactory = new ChannelFactory<IEchoContract>("RelayEndpoint", new EndpointAddress(serviceUri)); channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential); IEchoContract channel = channelFactory.CreateChannel(); ((ICommunicationObject)channel).Open();
Все, что нам осталось сделать это добавить пару строчек кода в конфигурационные файлы обоих проектов. В серверную часть добавим следующую конфигурацию:
<?xml version="1.0"?> <configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> <system.serviceModel> <services> <service name="EchoService.Server.EchoServer"> <endpoint contract="EchoService.Source.IEchoContract" binding="netTcpRelayBinding"></endpoint> </service> </services> </system.serviceModel> </configuration>
В клиентскую же отправляется следующий фрагмент:
<?xml version="1.0"?> <configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> <system.serviceModel> <client> <endpoint name="RelayEndpoint" contract="EchoService.Source.IEchoContract" binding="netTcpRelayBinding"></endpoint> </client> </system.serviceModel> </configuration>
В обоих случаях указывается основная точка доступа к сервису и новый биндинг под названием netTcpRelayBinding (этот вид биндинга находится в сборке Microsoft.ServiceBus.dll и обеспечивает безопасную и надежную коммуникацию между компьютерами посредством Service Bus)
Все готово, осталось сделать лишь один маленький шаг перед запуском системы. А именно узнать на портале криденшалы для доступа (это наши Issuer Name и Issuer Secret, требуемые как клиентом так и сервером). Найти их можно в разделе AppFabric –> Service Bus в свойстве неймспейса под названием Default Key
По клику на кнопочке View откроется модальное окошко, в котором как раз и будут содержаться необходимые нам данные.
На этом все приготовления можно считать завершенными. Для демонстрации я покажу пару скриншотов ,показывающих функционирование системы.
Как видим система работает прекрасно, а для создания сервиса нам не пришлось прикладывать значительных усилий, большинство рутинной работы за нас выполняет новый WCF-биндинг, находящийся в пространстве имен Microsoft.ServiceBus.
На этом пост можно завершать. Исходные файлы проекта можно взять по следующей ссылке: AppFabric Service Bus Echo Service. Очень скоро мы познакомимся с более прогрессивными и изощренными вариантами применения Service Bus, а пока что спасибо за внимание, надеюсь публикация была полезна и интересна :)
Комментариев нет:
Отправить комментарий