Разобравшись в теории, что такое Windows Azure OS, хочется попробовать все на практике. Для этого давайте создадим простой сервис для облака, в котором используем одну Web роль, а также 2 вида объектов поддерживаемых Storage: Blob и Table. Для того чтобы не изобретать велосипед, возьмем одно из демо-приложений из Windows Azure Training Kit.
Шаг 1. Создание проекта
Итак, приступим. Создадим новый проект в Visual Studio.
Для этого выберите шаблон Windows AzureCloud Service и введите имя проекта GuestBook.
В открывшемся диалоге New Cloud Service Project выберите ASP.NET Web Role добавьте ее в проект и переименуйте в GuestBook_WebRole.
Давайте теперь посмотрим на Solution Explorer. Для нашего сервиса были созданы 2 проекта. Один из них называется GuestBook и содержит схему и конфигурацию самого сервиса, а также конфигурацию для всех Web и Worker ролей, включенных в сервис. Второй проект называется GuestBook_WebRole и является обычным ASP.Net Web приложением. Единственное его отличие в том, что он содержит класс WebRole, который позволяет управлять поведением роли при ее инициализации, запуске и остановке.
Давайте боле детально рассмотрим все элементы проекта GuestBook. Их всего три:
- Файл ServiceDefinition.csdef описывает модель сервиса. Он содержит метаданные необходимые Windows Azure для того чтобы корректно настроить и запустить сервис: список ролей сервиса с необходимыми размерами виртуальных машин, список эндпоинтов и сертификатов для каждой роли, а также определения настроек для локального хранилища. Обратите внимание, что после публикации сервиса в облако, его модель уже нельзя будет изменить.
- Файл ServiceConfiguration.cscfg содержит количество экземпляров для каждой роли и значения для параметров конфигурации определенных в файле модели. В отличие от модели конфигурацию сервиса можно изменять в любой момент. Для этого нужно просто загрузить в облако новый файл конфигурации.
- папка Roles, в которой находятся настройки для каждой из ролей, включенных в сервис. На самом деле папка Roles просто предоставляет удобный UI для редактирования файлов модели и конфигурации.
Шаг 2. Создание модели данных
Наша гостевая книга будет хранить свои записи в таблице GuestBook в Azure Storage, для доступа к которой мы будем использовать библиотеку ADO.NET Data Services.
Добавим к нашему сервису новый проект: библиотеку классов GuestBook_Data. Добавим в новую библиотеку ссылку на Microsoft.WindowsAzure.StorageClient и System.Data.Service.Client.
Удалим из библиотеки класс Class1 и добавим GuestBookEntry, который будет описывать одну запись нашей гостевой книги. Измените файл GuestBookEntry.cs так, чтобы он соответствовал листингу приведенному ниже:
Обратите внимание, мы использовали класс TableServiceEntry как базовый для GuestBookEntry. В этом классе уже определены свойства PartitionKey, RowKey и TimeStamp, обязательные для всех сущностей сохраняемых в таблицах хранилища Windows Azure.
Кроме того, мы определили, что PartitionKey нашей таблицы будет хранить дату добавления записи. Это значит что таблица GuestBook будет содержать отдельную секцию для каждой даты.
Добавим теперь в библиотеку класс GuestBookDataContext, в котором реализуем доступ к таблице GuestBook. Для этого унаследуем его от TableServiceContext и реализуем свойство IQueryable<GuestBookEntry>. Окончательный вид класса GuestBookDataContext должен соответствовать приведенному в листинге.
Теперь добавим в библиотеку класс GuestBookEntryDataSource. Мы будем использовать его для привязки к данных к элементам управления на ASP.Net странице. Кроме того именно этот класс будет отвечать за создание таблицы GuestBook в хранилище. (Метод CreateTablesFromModel класса CloudTableClient пробегается по всем открытым IQueryable<Т> свойствам класса GuestBookDataContext и создает для них соответствующие таблицы, если они еще не существуют). Сейчас GuestBookEntryDataSource должен выглядеть следующим образом:
Добавим в него метод для выборки сегодняшних записей из таблицы:
Метод для добавления новых записей:
И последний метод, который будет обновлять URI для картинки связанной с записью из таблицы GuestBook.
Шаг 3. Модификация Web роли.
Теперь давайте обновим Web роль, так чтобы она могла добавлять и отображать записи гостевой книги. Для начала давайте добавим в GuestBook_WebRole ссылки на Microsoft.WindowsAzure.StorageClient и GuestBook_Data.
Теперь на страницу Default.aspx надо добавить элементы управления для добавления и просмотра записей, а также привязать к ним данные и команды. Я не буду приводить здесь необходимую для этого разметку, т.к она не содержит ничего специфичного для Windows Azure, Вы сможете найти ее в архиве проекта вместе с со всеми остальными исходниками.
Разобравшись с разметкой, давайте добавим странице нужной функциональности. Для этого в классе страницы объявим такие поля:
Теперь давайте посмотрим как можно проинициализировать хранилище блобов. Для начала надо удостовериться, что инициализация не произойдет многократно, затем из конфигурации получить параметры аккаунта для подключения к Azure Storage, затем, используя аккаунт, создать клиента для доступа к Storage и получить ссылку на нужный контейнер блобов:
Ну и напоследок давайте посмотрим как в нашу гостевую книгу можно добавлять записи. Здесь тоже все достаточно просто. Сперва выбранное изображение загружается в хранилище блобов. Затем создается новая запись, в которую добавляется ссылка на только что сохраненный блоб. Затем запись добавляется в таблицу хранилища.
Для того чтобы наша веб роль могла получить доступ к Azure Storage нам надо добавить параметры аккаунта в ее конфигурацию. Для этого в свойствах веб роли на закладке настроек добавим строку соединения. Назовем ее DataConnectionString, а в значение ей подставим “UseDevelopmentStorage=true”. Это допустимо т.к. мы не планируем публиковать свой сервис в облаке, а только потестируем его на локальном компьютере.
Теперь для получения полностью функциональной веб роли нам осталось только инициализировать ConfigurationPublisher’а для того чтобы в дальнейшем вызов метода FromConfigurationSetting мог создать нам экземпляр класса CloudStorageAccount. Для чего это надо можно прочитать здесь. Итак, давайте добавим в метод OnStart класса WebRole непосредственно перед оператором return следующий код:
Все. После этого наш сервис можно запустить и протестировать. Windows Azure SDK предоставляет полнофункциональную среду для эмуляции облака на машине разработчика. Подробнее об этом можно прочитать здесь.
После того, как вы отладите и протестируете свой сервис локально, нужно будет опубликовать его в облаке. Сделать это достаточно просто. В контекстном меню проекта GuestBook выберите Publish. В открывшемся диалоговом окне вы сможете опубликовать свой сервис в облаке прямо из Visual Studio, либо только создать установочный пакет. Используя этот пакет вы сможете позже опубликовать свой сервис с портала Windows Azure.