Microsoft Azure
Облачный бизнес
Вам понадобится

Microsoft Azure

Попробуйте платформу Microsoft Azure совершенно бесплатно.

Visual Studio

Бесплатная версия Visual Studio, позволяющая создавать приложения для платформы Microsoft Azure.

SDKs и дополнительные
инструменты

Инструменты разработки приложений для платформы Microsoft Azure.

 

Разработка гибридного приложения (on-premise/cloud) на .NET с использованием Windows Azure Service Bus Relay

Развернуть гибридные облачные приложения на платформе Windows Azure можно безо всякого труда с помощью среды разработки Visual Studio 2012 и бесплатного пакета Windows Azure SDK для .NET. При изложении материала предполагается, что пользователь не имеет опыта работы с Windows Azure. Менее чем за 30 минут вы создадите приложение, использующее несколько облачных ресурсов Windows Azure.

О чем пойдет речь в данном руководстве:

  • Как создать или адаптировать существующую веб-службу для использования в веб-решении.
  • Как использовать ретранслятор сервисной шины Windows Azure для обмена данными между приложением Windows Azure и размещенной в любом местtе веб-службой.

Использование ретранслятора сервисной шины в гибридных решениях

Как правило, бизнес-решения объединяют собственный код, написанный для удовлетворения новых и уникальных бизнес-требований, со стандартными функциями имеющихся решений и систем.

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

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

Сценарий решения

В этом руководстве вы создадите веб-сайт ASP.NET MVC 4, где можно будет просматривать список продуктов на странице инвентаризационных данных об этих продуктах.

clip_image002

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

Ниже приведен снимок экрана начальной страницы готового веб-приложения.

clip_image004

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

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

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

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

clip_image012

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

clip_image014

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

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

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

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

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

clip_image015

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

clip_image017

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

clip_image019

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

clip_image021

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

Создание локального сервера

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

Этот проект будет запущен в качестве консольного приложения Visual Studio. Он использует пакет сервисной шины NuGet для включения библиотек этой шины и параметров конфигурации. Расширение NuGet Visual Studio упрощает установку и обновление библиотек и средств в Visual Studio и Visual Web Developer. Использование пакета NuGet — самый простой способом получить API сервисной шины и настроить приложение со всеми зависимостями этой шины. Сведения об использовании пакета NuGet и сервисной шины см. в статье « Использование пакета сервисной шины NuGet».

Создание проекта

Запустите Visual Studio 2012 с правами администратора. Для этого щелкните правой кнопкой мыши Visual Studio 2012, а затем выберите пункт Run as administrator.

В Visual Studio в меню File последовательно выберите NewProject.

В области Installed Templates в группе Visual C# щелкните Console Application. В поле Name введите имя ProductsServer.

Нажмите кнопку OK, чтобы создать проект ProductsServer. В Solution Explorer правой кнопкой мыши щелкните ProductsServer и выберите пункт Properties. В левой части откройте вкладку Application и выберите .NET Framework 4 в раскрывающемся списке Target framework. При выводе запроса на перезагрузку проекта нажмите кнопку Yes.

В Solution Explorer правой кнопкой мыши щелкните References и выберите команду Manage NuGet Packages...

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

Обратите внимание, что теперь в окне отображаются необходимые сборки клиентов.

Добавьте новый класс для контракта по продуктам. В Solution Explorer правой кнопкой мыши щелкните ProductsServer, а затем последовательно выберите AddClass.

В поле Name введите имя ProductsContract.cs. Затем нажмите кнопку Add. ВProductsContract.cs замените определение пространства имен следующим кодом, который определят контракт для службы.

namespace ProductsServer 
{ 
    using System.Collections.Generic; 
    using System.Runtime.Serialization; 
    using System.ServiceModel; 


    // Define the data contract for the service 
    [DataContract] 
    // Declare the serializable properties 
    public class ProductData 
    { 
        [DataMember] 
        public string Id { get; set; } 
        [DataMember] 
        public string Name { get; set; } 
        [DataMember] 
        public string Quantity { get; set; } 
    } 


    // Define the service contract. 
    [ServiceContract] 
    interface IProducts 
    { 
        [OperationContract] 
        IList<ProductData> GetProducts(); 
    } 


    interface IProductsChannel : IProducts, IClientChannel 
    { 
    } 
}

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

namespace ProductsServer 
{ 
    using System; 
    using System.Linq; 
    using System.Collections.Generic; 
    using System.ServiceModel; 


// Implement the IProducts interface 
class ProductsService : IProducts 
{ 
    // Populate array of products for display on Web site 
    ProductData[] products = 
        new [] 
            { 
                new ProductData{ Id = "1", Name = "Rock", 
                                  Quantity = "1"}, 
                new ProductData{ Id = "2", Name = "Paper", 
                                  Quantity = "3"}, 
                new ProductData{ Id = "3", Name = "Scissors", 
                                  Quantity = "5"}, 
                new ProductData{ Id = "4", Name = "Well", 
                                  Quantity = "2500"}, 
            }; 

    // Display a message in the service console application 
    // when the list of products is retrieved 
    public IList<ProductData> GetProducts() 
    { 
        Console.WriteLine("GetProducts called."); 
        return products; 
    } 
} 

class Program 
{ 
    // Define the Main() function in the service application 
    static void Main(string[] args) 
    { 
        var sh = new ServiceHost(typeof(ProductsService)); 
        sh.Open(); 


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


        sh.Close(); 
    } 
} 
}

В Solution Explorer дважды щелкните файл app.config, чтобы открыть его в редактореVisual Studio. Замените содержимое  следующим кодом XML. Замените yourServiceNamespace названием своего пространства имен службы, аyourIssuerSecret — ключом, полученным ранее с портала управления Windows Azure.

<system.serviceModel> 
  <extensions> 
      <behaviorExtensions> 
        <add name="transport
ClientEndpointBehavior" type="Microsoft.ServiceBus.
Configuration.TransportClientEndpointBehaviorElement, 
Microsoft.ServiceBus, Version=1.7.0.0, Culture=neutral, 
PublicKeyToken=31bf3856ad364e35"/> 
      </behaviorExtensions> 
      <bindingExtensions> 
          <add name="netTcpRelayBinding" type=
"Microsoft.ServiceBus.Configuration.NetTcpRelay
BindingCollectionElement, Microsoft.ServiceBus, 
Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
      </bindingExtensions> 
  </extensions> 
  <services> 
      <service name="ProductsServer.ProductsService"> 
        <endpoint address="sb://yourService
Namespace.servicebus.windows.net/products" binding="
netTcpRelayBinding" contract="ProductsServer.IProducts" 
behaviorConfiguration="products"/> 
      </service> 
  </services> 
  <behaviors> 
      <endpointBehaviors> 
        <behavior name="products"> 
          <transportClientEndpointBehavior> 
            <tokenProvider> 
                <sharedSecret issuerName=
"owner" issuerSecret="yourIssuerSecret" /> 
            </tokenProvider> 
          </transportClientEndpointBehavior> 
        </behavior> 
      </endpointBehaviors> 
  </behaviors> 
</system.serviceModel>

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

Создание приложения ASP.NET MVC

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

Создание проекта

Запустите Microsoft Visual Studio 2012 с правами администратора. Для функционирования эмулятора вычислений Windows Azure, который рассматривался ранее в этом руководстве, требуется запустить Visual Studio с правами администратора.

В Visual Studio в меню File последовательно выберите NewProject.

В области Installed Templates в группе Visual C# щелкните ASP.NET MVC 4 Web Application. Присвойте проекту имя ProductsPortal. Затем нажмите кнопку OK.

В списке Select a template выберите Internet Application, а затем нажмите кнопку OK.

В Solution Explorer правой кнопкой мыши щелкните Models, а затем последовательно выберите AddClass. В поле Name введите имя Product.cs. Затем нажмите кнопку Add.

Изменение веб-приложения

В файле Product.cs в Visual Studio замените существующее определение пространства имен следующим кодом.

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

Создание приложения ASP.NET MVC

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

Создание проекта

Запустите Microsoft Visual Studio 2012 с правами администратора. Для функционирования эмулятора вычислений Windows Azure, который рассматривался ранее в этом руководстве, требуется запустить Visual Studio с правами администратора.

В Visual Studio в меню File последовательно выберите NewProject.

В области Installed Templates в группе Visual C# щелкните ASP.NET MVC 4 Web Application. Присвойте проекту имя ProductsPortal. Затем нажмите кнопку OK.

В списке Select a template выберите Internet Application, а затем нажмите кнопку OK.

В Solution Explorer правой кнопкой мыши щелкните Models, а затем последовательно выберите AddClass. В поле Name введите имя Product.cs. Затем нажмите кнопку Add.

Изменение веб-приложения

В файле Product.cs в Visual Studio замените существующее определение пространства имен следующим кодом.

// Declare properties for the products inventory 
namespace ProductsWeb.Models 
{ 
    public class Product 
    { 
        public string Id { get; set; } 
        public string Name { get; set; } 
        public string Quantity { get; set; } 
    } 
}

В файле HomeController.cs в Visual Studio замените существующее определение пространства имен следующим кодом.

namespace ProductsWeb.Controllers 
{ 
    using System.Collections.Generic; 
    using System.Web.Mvc; 
    using Models; 


    public class HomeController : Controller 
    { 
        // Return a view of the products inventory 
        public ActionResult Index
(string Identifier, string ProductName) 
        { 
            var products = new List&lt;Product&gt; 
                {new Product
 {Id = Identifier, Name = ProductName}}; 
            return View(); 
        } 
    } 
}

В Solution Explorer разверните папки Views\Shared.

clip_image034

Затем измените название страницы, впечатав вместо текста заголовка в файле _Layout.cshtml текст LITWARE'S Products. Дважды щелкните файл _Layout.cshtml, чтобы открыть его в редакторе Visual Studio.

В тексте найдите название страницы, заключенное в теги h1. Измените название My MVC Application на LITWARE's Products. Ниже показано место для ввода нового текста.

clip_image036

В Solution Explorer разверните папки Views\Home.

clip_image038

Дважды щелкните файл Index.cshtml, чтобы открыть его в редакторе Visual Studio. Замените все содержимое файла следующим кодом.

@model IEnumerable<ProductsWeb.Models.Product> 
@{ 
  ViewBag.Title = "Product Inventory"; 
} 
<h2>Product Inventory</h2> 
<table> 
<tr> 
  <th>Name</th><th>Quantity</th> 
</tr> 
@foreach (var item in Model) 
{ 
  <tr> 
  <td>@item.Name</td> 
  <td>@item.Quantity</td> 
</tr> 
} 
</table>

Чтобы проверить точность выполненных на данный момент действий, нажмите клавишуF6 или сочетание клавиш Ctrl + Shift + B для создания проекта.

Локальный запуск приложения

Запустите приложение, чтобы проверить его работу. Убедитесь, что ProductsPortalявляется активным проектом. В Solution Explorer правой кнопкой мыши щелкните имя проекта и выберите команду Set As Startup Project. В Visual Studio нажмите кнопку F5. В браузере должно появиться запущенное приложение.

clip_image040

Подготовка приложения к развертыванию на платформе windows azure

Теперь вы подготовите приложение к запуску в размещенной службе Windows Azure. В состав приложения уже входит проект развертывания Windows Azure. Этот проект содержит данные конфигурации, необходимые для надлежащего запуска приложения в облаке.

Чтобы приложение можно было развертывать в облаке, в Solution Explorer правой кнопкой мыши щелкните проект ProductsPortal, а затем выберите команду Add Windows Azure Deployment Project.

clip_image042

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

clip_image044

В браузере по-прежнему будет отображаться локально исполняемое приложение; оно выглядит и работает точно так же, как обычное приложение ASP.NET MVC 4.

Объединение частей

Следующее действие — подключение локального сервера продуктов к приложению ASP.NET MVC. Если проект ProductsPortal, подготовленный в разделе «Создание приложения ASP.NET MVC», еще не открыт, откройте его в Visual Studio.

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

В Solution Explorer щелкните правой кнопкой мыши проект ProductsPortal, а затем последовательно выберите AddExisting Item. Из консольного проекта ProductsServerперейдите к файлу ProductsContract.cs. Выделите файл ProductsContract.cs. Щелкните стрелку вниз рядом с кнопкой Add, а затем выберите Add as Link.

clip_image045

Теперь откройте файл HomeController.cs в редакторе Visual Studio и замените определение пространства имен следующим кодом. Замените yourServiceNamespaceименем своего пространства имен службы, а yourIssuerSecret — своим ключом. Это позволит клиенту вызывать локальную службу с возвращением результата вызова.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 


namespace ProductsWeb.Controllers 
{ 
    using System.Linq; 
    using System.ServiceModel; 
    using System.Web.Mvc; 
    using Microsoft.ServiceBus; 
    using Models; 
    using ProductsServer; 


public class HomeController : Controller 
{ 
    // Declare the channel factory 
    static ChannelFactory&lt;IProductsChannel&gt; channelFactory; 


static HomeController() 
{ 
    // Create shared secret token credentials for authentication 
    channelFactory = new ChannelFactory&amp;lt;
IProductsChannel&amp;gt;(new NetTcpRelayBinding(), 
        "sb://yourServiceNamespace.servicebus
.windows.net/products"); 
    channelFactory.Endpoint.Behaviors.Add
(new TransportClientEndpointBehavior { 
        TokenProvider = TokenProvider.
CreateSharedSecretTokenProvider( 
            "owner", "yourIssuerSecret") }); 
} 


public ActionResult Index() 
{ 
    using (IProductsChannel channel = 
channelFactory.CreateChannel()) 
    { 
        // Return a view of the products inventory 
        return this.View(from prod in channel.GetProducts() 
                          select 
                              new Product { Id = prod.Id, Name = prod.Name, 
                                  Quantity = prod.Quantity }); 
    } 
} 
} 
}

В Solution Explorer щелкните правой кнопкой мыши решение ProductsPortal, а затем последовательно выберите AddExisting Project. Перейдите к проекту ProductsServer, затем дважды щелкните файл решения ProductsServer.csproj, чтобы добавить его.

В Solution Explorer щелкните правой кнопкой мыши решение ProductsPortal и выберите пункт Properties.

В левой части щелкните Startup Project. В правой части щелкните Multiple startup projects. Убедитесь, что ProductsServerProductsPortal.Azure и ProductsPortal отображаются в указанной последовательности, значение Start задано в качестве действия для ProductsServer и ProductsPortal.Azure, значение None задано в качестве действия для ProductsPortal. Например:

clip_image047

В левой части диалогового окна Properties щелкните ProjectDependencies. В раскрывающемся списке Project Dependencies выберите ProductsServer. Убедитесь, что флажок ProductsPortal снят, а флажок ProductsPortal.Azure установлен. Затем нажмите кнопку OK.

clip_image048

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

В меню File в Visual Studio выберите команду Save All. Чтобы создать и запустить программу, нажмите клавишу F5. Сначала должен запуститься локальный сервер (консольное приложение ProductsServer), а затем в окне браузера — приложение ProductsWeb, как показано на снимке экрана ниже. В этот момент вы увидите, что в инвентаризационном списке продуктов отображаются данные, полученные из локальной системы службы продуктов.

clip_image049

Развертывание приложения на платформе windows azure

В Solution Explorer щелкните правой кнопкой мыши проект ProductsPortal, а затем выберите команду Publish to Windows Azure. Во время первой публикации в Windows Azure сначала потребуется загрузить учетные данные, щелкнув указанную в Visual Studio ссылку.

Щелкните Sign in to download credentials.

clip_image051

Войдите с помощью идентификатора Live ID.

clip_image053

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

clip_image055

В диалоговом окне публикации щелкните Import.

clip_image057

Найдите и выберите только что загруженный файл, а затем нажмите кнопку Next. Выберите подписку Windows Azure, в которую следует выполнить публикацию.

clip_image059

Если подписка не содержит размещенные службы, появится запрос на создание такой службы. Размещенная служба функционирует в качестве контейнера для приложения в рамках подписки Windows Azure. Введите имя для идентификации приложения и выберите регион, для которого следует оптимизировать приложение. (Можно ожидать сокращения времени загрузки приложения, к которому обращаются пользователи этого региона.)

clip_image061

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

clip_image063

На последней странице нажмите кнопку Publish, чтобы начать процесс развертывания.

clip_image065

Это займет приблизительно 5–7 минут. Поскольку вы выполняете публикацию впервые, Windows Azure введет в эксплуатацию виртуальную машину, повысит уровень безопасности, создаст веб-роль на виртуальной машине для размещения приложения, развернет код в эту веб-роль и таким образом настроит подсистему балансировки нагрузки и сетевые параметры, чтобы предоставить к приложению общий доступ.

В ходе процесса публикации вы можете отслеживать действия в окне Windows Azure Activity Log, которое обычно закреплено в нижней части Visual Studio или Visual Web Developer.

clip_image067

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

clip_image069

Веб-сайт зависит от локального сервера, поэтому для обеспечения надлежащей работы приложение ProductsServer для веб-сайта следует запускать локально. Поскольку запросы выполняются на веб-сайте в облаке, вы сможете увидеть запросы, входящие в локальное консольное приложение в соответствии с результатами GetProducts called (см. снимок экрана ниже).

clip_image071

Останов и удаление приложения

Развернутое приложение может потребоваться отключить, чтобы получить возможность создания и развертывания других приложений в течение 750 часов (или месяца) [31 дня (или месяца)] бесплатно предоставляемого времени работы сервера.

Windows Azure выставляет счета на экземпляры веб-роли за час использованного времени сервера. Учет времени использования сервера начинается после развертывания приложения, даже если экземпляры не запущены и находятся в состоянии останова. Бесплатная учетная запись действует в течение 750 часов (или месяца) [31 дня (или месяца)] работы выделенного сервера виртуальной машины для размещения этих экземпляров веб-роли.

Далее представлены действия по остановке и удалению приложения. Войдите на портал управления Windows Azure Management Portal, http://windows.azure.com, и щелкните Hosted Sevices, Storage Accounts & CDN, а затем — Hosted Services.

clip_image072

Нажмите кнопку Stop, чтобы временно приостановить приложение. Для повторного запуска приложения просто нажмите кнопку Start. Чтобы полностью удалить приложение из Windows Azure без возможности восстановления, нажмите кнопку Delete.

clip_image073

Автор статьи: Владимир Юнев.