Блог Сергея Байдачного

Мой блог о технологиях

Archive for the ‘Windows Azure’ Category

Дни разработчика в регионах

with one comment

Регистрируемся!

6 жовтня

Дніпропетровськ

7 жовтня

Харків

13 жовтня

Миколаїв

14 жовтня

Одеса

20 жовтня

Рівне

21 жовтня

Львів

24 жовтня

Івано-Франківськ

27 жовтня

Вінниця

Реклама

Written by Sergiy Baydachnyy

30.09.2014 at 07:05

Опубликовано в Microsoft, Windows Azure

Tagged with

Основы Windows Azure с Сергеем Поплавским

leave a comment »

Коллеги, опубликовал несколько лекций от Сергея Поплавского. Специально для MVA:

http://www.microsoftvirtualacademy.com/training-courses/introtoazurewithpoplavskiy

 

Не забываем выбирать Ukraine при регистрации и просмотре.

Written by Sergiy Baydachnyy

22.04.2014 at 08:04

Опубликовано в Windows Azure

Tagged with

Активация триальной подписки в Windows Azure

with one comment

Сергей Поплавский опубликовал видео о том, как можно легко активировать триальную подписку в Windows Azure с месячным лимитом в 200 у. е. Хороший повод попробовать:

http://spoplavskiy.azurewebsites.net/?p=287

Written by Sergiy Baydachnyy

15.08.2013 at 15:17

Опубликовано в Windows Azure

Tagged with

Бесплатный онлайн курс по Windows Azure

leave a comment »

Коллеги просили оповестить о том, что завтра, для всех желающих, состоится первая лекция онлайн курса, посвященного Windows Azure. Приглашаем всех студентов и новичков в Azure. Лекции читает Сергей Поплавский. Ссылка на регистрацию тут: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032540513&Culture=UK-UA&community=0. Начало в 17:00.

Written by Sergiy Baydachnyy

25.12.2012 at 17:37

Опубликовано в Windows Azure

Tagged with

Windows Phone 7: Разрабатываем приложение с использованием Push Notification (часть 1, веб-роль)

4 комментария

Этим постом я начинаю серию из 4-х статей, посвященных разработке решения для Windows Phone 7 с использованием Push Notification. Описанное тут решение мы разрабатывали для Украинского Медиа Холдинга. Между тем оно является типовым, хотя информацию по некоторым шагам найти достаточно сложно.

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

Поскольку Windows Phone 7 обладает такой замечательной вещью, как Push Notification, то было принято решение, реализовать аналогичный функционал для устройств WP 7 на бесплатной основе. Ведь для использования Push Notification мобильный оператор не используется, а уведомления доставляются с помощью специальной Push Notification службы, которой управляет Microsoft.

Идея очень простая: клиент, используя приложение партнера, подписывается на службу доставки мгновенных сообщений. При этом клиент передает партнеру уникальный URL, позволяющий партнеру связаться с Notification службой и передать сообщение на конкретный телефон. Партнер, генерируя новое сообщение, опрашивает свою базу адресов, и по каждому из адресов отправляет сообщение в Push Notification службу, которая на основании уникального адреса нотифицирует конкретный телефон, передавая ему сообщение.

Таким образом, при разработке этого решения, нам необходимо следующие три компонента:

· Служба, которая позволяет получить новое сообщение от оператора и поставить его в очередь;

· Модуль (служба), который обрабатывает сообщения в очереди;

· Клиент для Windows Phone 7, позволяющий пользователю подписаться на службу и настроить параметры уведомлений;

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

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

Таким образом, 3 из 4 статей будут иметь достаточно опосредованное отношение к Windows Phone, а скорее относятся к Windows AzureJ

Начнем работу. На первом шаге создадим проект в Visual Studio на базе шаблона Windows Azure

image

В создаваемое решение добавим две роли, это WCF Service Web Role и Worker Role. Тут Вашим ролям можно дать более осмысленные названия (я не буду).

image

Про Рабочую роль сейчас забудем и сосредоточимся на реализации WCF службы.

Опишем интерфейс нашей службы следующим образом:

   1:      [ServiceContract]
   2:      public interface INotification
   3:      {
   4:          [OperationContract]
   5:          void SubscribePhoneToService(Guid guid, string pushServiceUri);
   6:   
   7:          [OperationContract]
   8:          SMSMessage[] RefreshData();
   9:   
  10:          [OperationContract]
  11:          void NewSMSMessage(string sms, string login, string password);
  12:      }
  13:   
  14:   
  15:      [DataContract]
  16:      public class SMSMessage
  17:      {
  18:          string date;
  19:          string message;
  20:   
  21:          [DataMember]
  22:          public string DateTimeValue
  23:          {
  24:              get { return date; }
  25:              set { date = value; }
  26:          }
  27:   
  28:          [DataMember]
  29:          public string MessageValue
  30:          {
  31:              get { return message; }
  32:              set { message = value; }
  33:          }
  34:      }

 

Тут описан класс SMSMessage, с помощью которого мы будем передавать данные между службой и телефонами, а также интерфейс INotification, описывающий три метода интерфейса службы. Тут определены следующие методы:

· SubscribePhoneToService – этот метод позволяет подписать телефон на сообщения, принимая уникальный ID телефона и адрес службы уведомлений для отправки сообщений данному устройству. Обратите внимание, что сообщения высылаются каждому подписанному телефону отдельно. Это дает возможность кастомизировать текст сообщения и фильтры, в зависимости от настроек. В данном случае какой-то специальной настройки для конкретного телефона мы не поддерживаем, поэтому метод принимает всего два параметра;

· RefreshData – этот метод необходим, если пользователь запустил приложение и хочет посмотреть последние сообщения;

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

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

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

Первым делом создадим хранилище сообщений и подписок. Я решил использовать SQL Azure, так как меня больше устраивало реляционное хранилище. Данных тут не много, зато можно делать сложные выборки.

Для этого воспользуемся панелью управления Windows Azure и создадим новую базу

image

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

Server=tcp:imc39784zf.database.windows.net,1433;Database=UkraineTest;User ID=sbaidachni@imc39784zf;Password=myPassword;Trusted_Connection=False;Encrypt=True;

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

image

image

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

Поскольку нам нужен также и Storage Service, то создадим и его. Для этого также воспользуемся панелью управления.

image

Подготовительная работа завершена.

Теперь вернемся в Visual Studio и приступим к написанию кода. Первым делом внесем изменения в конфигурацию решения.

Обратите внимание, что параметры приложения (строка соединения, логин, доступ к Storage аккаунту) нужно прописывать в csdef и cscfg файлах. Если Вы внесете настройки в Web.Config (как Вы привыкли делать в обычных веб-приложениях), то менять их, в процессе работы, у Вас не выйдет.

Поэтому перейдите к настройкам нашей веб-роли и введите необходимые параметры именно там.

image

Тут мы ввели Логин, Пароль, строку соединения к базе, а также строку соединения к Storage Account. Последняя может быть описана с помощью специальной панели:

image

Тут Вы указываете имя созданного Storage аккаунта и ключ, который можно взять в панели управления Windows Azure. Не забудьте поменять HTTPS на HTTP. Наши сообщения не представляют особого интереса, поэтому лишняя безопасность тут не требуется.

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

А теперь приступаем к реализации кода.

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

   1:  public void SubscribePhoneToService(Guid guid, string pushServiceUri)
   2:  {
   3:      SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   4:      SqlCommand comm = new SqlCommand("select count(*) from PhoneTable where PhoneID=@par1", conn);
   5:   
   6:      comm.Parameters.Add(new SqlParameter("par1", guid.ToString()));
   7:   
   8:      conn.Open();
   9:   
  10:      int res = (int)comm.ExecuteScalar();
  11:   
  12:      if (res > 0)
  13:      {
  14:          SqlCommand comm1 = new SqlCommand("update phonetable set PhoneUrl=@par2 where PhoneID=@par1", conn);
  15:          comm1.Parameters.Add(new SqlParameter("par1", guid.ToString()));
  16:          comm1.Parameters.Add(new SqlParameter("par2", pushServiceUri));
  17:          comm1.ExecuteNonQuery();
  18:      }
  19:      else
  20:      {
  21:          SqlCommand comm1 = new SqlCommand("insert phonetable (PhoneID, PhoneUrl) values (@par1, @par2)", conn);
  22:          comm1.Parameters.Add(new SqlParameter("par1", guid.ToString()));
  23:          comm1.Parameters.Add(new SqlParameter("par2", pushServiceUri));
  24:          comm1.ExecuteNonQuery();
  25:      }
  26:   
  27:      conn.Close();
  28:      conn.Dispose();
  29:  }

 

Фактически, мы связываемся с базой, чтобы проверить наличие устройства. Если устройства нет, то мы вносим его URL в базу, если оно есть, то обновляем URL (он может измениться). Интерес представляет класс RoleEnvironment, позволяющий получить доступ к настройкам роли.

Второй метод, RefreshData, возвращает последние N сообщений из базы. Тут лучше использовать LINQ, чтобы уменьшить количество строк кода, но я сейчас не буду усложнять код технологиями.

   1:  SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   2:  string n = RoleEnvironment.GetConfigurationSettingValue("NRecords");
   3:   
   4:  SqlCommand comm = new SqlCommand("select TOP (" + n + ") * from messagetable order by messagedate desc", conn);
   5:   
   6:  conn.Open();
   7:   
   8:  SqlDataReader res = comm.ExecuteReader();
   9:   
  10:  List<SMSMessage> SMSMessages = new List<SMSMessage>();
  11:   
  12:  while (res.Read())
  13:  {
  14:      SMSMessages.Add(new SMSMessage() { MessageValue = res["MessageText"].ToString(), DateTimeValue = res["MessageDate"].ToString() });
  15:  }
  16:   
  17:  conn.Close();
  18:  conn.Dispose();
  19:   
  20:  return SMSMessages.ToArray();

 

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

   1:  if ((login.Equals(RoleEnvironment.GetConfigurationSettingValue("Login"))) && (password.Equals(RoleEnvironment.GetConfigurationSettingValue("Password"))))
   2:  {
   3:   
   4:      SqlConnection conn = new SqlConnection(RoleEnvironment.GetConfigurationSettingValue("DatabaseConnection"));
   5:      SqlCommand comm = new SqlCommand("insert messagetable (MessageText, MessageDate) values (@par1, @par2)", conn);
   6:      comm.Parameters.Add(new SqlParameter("par2", DateTime.Now.ToUniversalTime().ToString()));
   7:      comm.Parameters.Add(new SqlParameter("par1", sms));
   8:   
   9:      conn.Open();
  10:   
  11:      comm.ExecuteNonQuery();
  12:   
  13:      conn.Close();
  14:      conn.Dispose();
  15:   
  16:      CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
  17:      {
  18:          configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
  19:   
  20:          RoleEnvironment.Changed += (sender, arg) =>
  21:          {
  22:              if (arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>()
  23:                  .Any((change) => (change.ConfigurationSettingName == configName)))
  24:              {
  25:                  if (!configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)))
  26:                  {
  27:                      RoleEnvironment.RequestRecycle();
  28:                  }
  29:              }
  30:          };
  31:      });
  32:   
  33:      CloudStorageAccount acc = CloudStorageAccount.FromConfigurationSetting("StorageConnection");
  34:      CloudQueueClient queueClient = acc.CreateCloudQueueClient();
  35:   
  36:      CloudQueue queue = queueClient.GetQueueReference("smsqueue");
  37:      queue.CreateIfNotExist();
  38:   
  39:      queue.AddMessage(new CloudQueueMessage(sms));
  40:  }

 

Тут мы вставляем новое сообщение в нашу таблицу, а также размещаем его в очереди. Для работы очереди мы использовали управляемую библиотеку Microsoft.WindowsAzure.StorageClient.dll, которая облегчает нам работу с REST API. Итак, тут мы создаем объект типа CloudStorageAccount, который будет ассоциироваться с нашим Storage аккаунтом в Azure. После чего создаем объект типа CloudQueue, который будет ассоциироваться с нашей очередью. И с помощью метода CreateIfNotExist создает новую очередь или получаем ссылку на существующую. После этого можно добавлять элементы.

Теперь необходимо реализовать рабочую роль, добавить поддержку https и написать клиента. Но об этом в следующей статье.

Written by Sergiy Baydachnyy

13.04.2011 at 12:12

Опубликовано в Windows Azure, Windows Phone

Tagged with , , ,

Как попробовать Windows Azure бесплатно

3 комментария

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

Хочу сразу прояснить ситуацию со временем работы аккаунта, так как мы получаем много запросов о том, что 24 часа мало, чтобы опробовать все возможности. 24 часа означают, что через указанное время, Ваши данные будут удалены из Windows Azure, но вы сможете зарезервировать для себя новое окружение (опять на 24 часа). Таким образом, Вы можете заниматься исследованием возможностей Windows Azure хоть круглый год. Ограничение в 24 часа гарантируют для нас две вещи: 1). Вы не будете использовать выданный аккаунт в коммерческих целях; 2). Наши ресурсы будут использоваться оптимальным образом. Ведь попробовав какую-то функциональность, Вы можете вернуться к своему аккаунту через длительный промежуток времени, не остановив ненужные Вам службы (ведь Вы за это все равно не платите).

Резюмирую все вышесказанное: ограничений по времени доступа в Azure НЕТ, а есть только время жизни выделенного окружения. Через каждые 24 часа Вы активируете для себя новое окружение и продолжаете работать.

Теперь о том, как вести работу в рамках данной программы.

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

image

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

image

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

Далее Вы попадаете в окно, позволяющее выделить окружение (Hosted Service).

Важно! По данной программе Вы получаете в пользование 3 экземпляра. Поэтому можете реализовать сколь угодно сложные сценарии в своем окружении. О том, как управлять несколькими экземплярами смотрите в моем предыдущем посте.

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

Итак, жмем кнопку «Резервировать» и переходим к следующему окну.

image

На этом этапе ничего выбрать нельзя, но Вы можете посмотреть, что Вы получаете под созданной учетной записью. Как я и говорил, несмотря на один Hosted Service, Вы будете иметь доступ к трем экземплярам (тут это почему-то не написано, но я допишу, потом, может быть).

Жмем «Дальше» и переходим к панели управления Вашим окружением.

image

Итак, мы имеем три закладки, на каждой из которых представлена информация о различных составляющих Windows Azure:

· Закладка Службы. Тут Вы сможете видеть все Ваши роли и их статус (до трех различных ролей). Тут же Вы можете удалить Ваше окружение или перейти к созданию нового.

· Закладка Storage Service. Тут для Вас уже создан активный аккаунт и Вы можете получить его имя, а также первичный и вторичный ключи, которые позволяют взаимодействовать Вашему приложению с таблицами, очередями и блобами, поддерживаемыми Storage службой.

· Закладка SQL Azure. Тут Вы можете получить строку соединения, позволяющую Вам получить доступ к SQL Azure как через SQL Management Studio, так и из Ваших приложений. В SQL Management Studio Вы создаете все необходимые таблицы, процедуры и связи, ну а затем используете все это добро в приложениях.

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

Итак, прежде чем переходить к развертыванию ролей, необходимо иметь какой-то готовый проект. Чтобы поэкспериментировать, Вы можете скачать Windows Azure Training Kit и выполнять примеры оттуда.

Имея проект в Visual Studio, Вам необходимо создать пакет. Для используем команду Publish (хотя ничего и не публикуем) и выбираем Create Service Package Only.

image

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

Остается только опубликовать пакет. Для этого возвращаемся в панель и Выбираем «Развернуть…»

Указываете путь к Вашему пакету и конфигурационному файлу и нажимаете «Развернуть».

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

Наслаждайтесь.

Written by Sergiy Baydachnyy

29.03.2011 at 12:53

Опубликовано в Windows Azure

Tagged with ,

Управление экземплярами в Windows Azure

5 комментариев

Сегодня Microsoft предлагает несколько способов, позволяющих получить доступ к Windows Azure на бесплатной основе. В Украине Вы можете получить доступ на 24-часа и 30 дней, не считая MSDN и возможностей, предлагаемых на http://azure.com. Однако, особенность первых двух программ состоит в том, что Вам не нужно вводить данные кредитной карты, что не позволит Вам перерасходовать лимит предоставляемых возможностей (хоть и случайно).

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

Основное ограничение предлагаемых программ, это предоставление только одного Hosted Service. Под Hosted Service мы будем понимать некое виртуальное окружение разработчика, позволяющее развернуть пакет и конфигурационный файл в Облако, задать сертификаты для организации https, поддерживать работы ролей. При этом Hosted Service обладает DNS (например, dev-club.cloudapp.net).

image

Как я уже отметил, по тестовым программам предоставляется только один Hosted Service, что может навести на мысль о том, что попробовать развернуть сложное решение не получится. Например, я хочу развернуть решение, содержащее веб-сайт, веб-службы и рабочую роль. Подобное решение я могу разрабатывать как независимые службы, разворачиваемые и конфигурируемые в отдельных пакетах. В этом случае нам необходимо иметь три Hosted Services. Однако следует обращать внимание не на количество Hosted Services, а на количество экземпляров (серверов), предоставляемых внутри одного Hosted Service. По предлагаемым программам их 3.

Обычно несколько экземпляров внутри одного окружения используются для организации масштабирования. Например, Ваш сайт не справляется с нагрузкой, и Вы добавляете в Ваше окружение еще несколько экземпляров, что позволяет увеличить нагрузку. Но в условиях «дефицита» Hosted Services Вы можете все Ваши компоненты конфигурировать и разворачивать как один пакет, размещая различные роли на различных экземплярах. Таким образом, имея три экземпляра в своем распоряжении, я могу развернуть до трех различных ролей. Более трех ролей развернуть нельзя, так как каждая роль должна владеть своим экземпляром (хотя для веб-сайтов есть свои особенности, которые мы также рассмотрим).

Итак, если Вы решили развернуть несколько ролей внутри одного окружения, то от Вас особо ничего и не требуется. Создайте новый Windows Azure Project в Visual Studio (или Web Developer Express) и добавьте необходимые роли к проекту (сразу или в процессе).

image

Все дело в конфигурации. Visual Studio тут же конфигурирует Ваши роли для развертывания в одном Hosted Service, на разные экземпляры. Рассмотрим сгенерированные конфигурационные файлы.

Конфигурационным файлом, настраивающим Ваше окружение (Hosted Service) является ServiceConfiguration.csсfg. Именно тут указывается, какие роли будут развернуты и какое количество экземпляров должно быть выделено для каждой роли. Обращаю Ваше внимание на то, что данный файл разворачивается отдельно от пакета и может быть модифицирован в процессе работы окружения. Например, Вам необходимо увеличить количество экземпляров под рабочую роль, Вы просто изменяете атрибут count в элементе Instances. Последнее можно выполнить через панель управления службами или с помощью специального API.

Второй конфигурационный файл ServiceDefinition.csdef используется для более гибкой конфигурации каждой роли. Например, Вы развернули две Web роли. Поскольку для окружения выдается одно имя DNS, то логично, что одна из Web ролей сможет работать на 80 порту, а вторая на любом другом (оба сайта на 80 порту работать не могут под одним DNS). Именно подобные настройки и конфигурируются в этом файле. Поскольку любые изменения в ServiceDefinition.csdef кардинально влияют на работу окружения, то файл разворачивается внутри пакета и не может быть модифицирован в процессе работы окружения. Если Вы решили что-то поменять, то необходимо выполнить повторное развертывание пакета в Ваше окружение, что приведет к временной его остановке.

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

image

Несмотря на обилие конфигурационных элементов, сейчас нас будут интересовать лишь два, это Sites и Endpoints.

С помощью элемента Endpoints (или соответствующей вкладки мастера), Вы можете определить параметры доступа к роли через DNS, указав порт, протокол (http или https), закрыв или открыв роль для доступа снаружи. Наиболее интересным параметром является порт. Именно возможность указать порт позволяет организовать работу нескольких служб в рамках одного DNS. Если Вы не планируете получать доступ к роли (например, у вас есть Рабочая роль, которая обрабатывает очередь сообщений, но не предусматривает прямой коммуникации), то элементы Endpoint могут полностью отсутствовать. Создав необходимые роль, внимательно посмотрите, правильно ли Visual Studio расставил порты и, при необходимости, поправьте их.

Обратите внимание, что для Web ролей конкретный Endpoint прописывается с помощью элемента Binding:

   1:      <Sites>
   2:        <Site name="Web">
   3:          <Bindings>
   4:            <Binding name="Endpoint1" endpointName="Endpoint1" />
   5:          </Bindings>
   6:        </Site>
   7:      </Sites>
   

Если Вы были достаточно внимательными, то у Вас должен был возникнуть вопрос, почему мы можем задать целую коллекцию Endpoints или Sites для одной Web роли, ведь веб-приложение у нас одно. И вот тут мы рассмотрим еще одну возможность, позволяющую Вам использовать выделенные экземпляры на полную – создание нескольких веб-сатов или виртуальных приложений внутри одной Web роли.

Начиная с конца прошлого года, Web роли в Windows Azure стали размещать под управлением полноценного Internet Information Service (Full IIS). А раз мы имеем дело с полноценным IIS, то создавать веб-сайт или виртуальную директорию внутри одной роли можно без особых проблем.

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

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

На втором этапе необходимо модифицировать ServiceDefinition.csdef, тут Вы добавляете внутрь уже существующей Web роли еще один раздел Site, где указываете стандартные параметры (имя, Endpoint):

   1:        <Site name="Web" physicalDirectory="..\PrecompiledWeb\WebSite3">
   2:          <Bindings>
   3:            <Binding name="Endpoint1" endpointName="Endpoint1" 
   4:               hostHeader="www.dev-club.com.ua" />
   5:          </Bindings>
   6:        </Site>
 

Вот этот блок и позволяет включить подготовленный сайт в Ваш проект. При этом, Вы можете совершенно спокойно использовать один и тот же Endpoint для нескольких приложений, задав атрибут hostHeader, где указываете имя хоста, которое будет использоваться для доступа к сайту. Аналогичный подход можно использовать, если Вы хотите создать несколько сайтов, ссылающихся на одну физическую директорию (причем все они создаются под управлением различных Application Pool).

Таким образом, несколько сайтов на одном экземпляре – не проблема. Вот только нужно сделать какие-то вещи «руками».

Аналогично можно разворачивать и виртуальные директории внутри любого из сайтов. Для этого используется два элемента: VirtualApplication, позволяющий задать имя виртуальной директории, а также путь к физическому каталогу; VirtualDirectory – используется внутри VirtualApplication и позволяет сформировать структуру виртуальных директорий виртуального приложения.

Таким образом, используя три экземпляра, Вы можете создавать любое количество сайтов и веб-служб на одном из них, а два экземпляра у Вас еще остаются для развертывания Рабочей роли (или двух), а также для масштабирования решенияJ

Чтобы увидеть все эти вещи в действии, Вы можете использовать скрипты из Windows Azure Training Kit, а также посетить наш Online training по Windows Azure.

Written by Sergiy Baydachnyy

29.03.2011 at 11:18

Опубликовано в Windows Azure

Tagged with ,