Начало работы с Облачными службами Azure (классическая версия) и ASP.NET

Обзор

Важно!

Облачные службы (классическая версия) объявлены устаревшими для новых клиентов. Их поддержка будет полностью прекращена 31 августа 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой . Это новая модель развертывания на основе Azure Resource Manager.

Это руководство описывает, как создавать многоуровневое приложение .NET с внешним ASP.NET MVC и как развернуть его в облачной службе Azure. Приложение использует базу данных Azure SQL, службу BLOB-объектов Azure и службу очередей Azure. Можно загрузить проект Visual Studio из галереи кода MSDN.

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

Приложение Contoso Ads

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

Изображение со списком рекламных объявлений

Приложение использует рабочий шаблон на основе очередей для разгрузки процессора от задач создания эскизов в фоновом режиме.

Альтернативная архитектура: Служба приложений и веб-задания

Это руководство описывает, как запускать фоновые и интерфейсные компоненты в облачной службе Azure. Альтернативой является запуск интерфейсной части в Службе приложений Azure и использование функции Веб-задания для серверной части. Руководство по веб-заданиям см. в статье Создание веб-задания .NET в службе приложений Azure. Сведения о том, как выбрать службы, см. в статье о сравнении Службы приложений, облачных служб и виртуальных машин Azure.

Что вы узнаете

  • Как подготовить компьютер к разработке для Azure путем установки пакета Azure SDK.
  • Как создать облачный проект Visual Studio с веб-ролью ASP.NET MVC и рабочей ролью ASP.NET MVC.
  • Как локально тестировать проект облачной службы, используя эмулятор службы хранилища Azure.
  • Как опубликовать облачный проект в облачной службе Azure и тестировать его с использованием учетной записи хранилища Azure.
  • Как отправлять файлы и хранить их в службе BLOB-объектов Azure.
  • Как использовать службу очередей Azure для связи между уровнями.

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

В руководстве предполагается, что вы понимаете базовые концепции облачной службы Azure, такие как термины веб-роль и рабочая роль. Кроме того, предполагается, что вы знаете, как работать с проектами ASP.NET MVC или веб-форм в Visual Studio. Пример приложения использует MVC, но многое в руководство также применимо к веб-формам.

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

Инструкции из этого руководства применимы к следующим продуктам:

  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2019

Если у вас нет ни одного из этих продуктов, Visual Studio может быть установлен автоматически при установке пакета SDK для Azure.

Архитектура приложения

Приложение хранит рекламу в базе данных SQL, используя Entity Framework Code First для создания таблиц и доступа к данным. Для каждого рекламного объявления база данных хранит два URL-адреса: один для полноразмерного изображения, другой для эскиза.

Изображение таблицы рекламных объявлений

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

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

Настройка среды разработки

Для начала настройте среду разработки с помощью Visual Studio и пакета SDK Azure.

  • Visual Studio 2019 включает в себя пакет SDK Azure. Если вы используете Visual Studio 2019, для среды разработки не требуются дополнительные настройки.

  • Для Visual Studio 2015 щелкните следующую ссылку, чтобы установить пакет SDK Azure для Visual Studio 2015.

  • Для Visual Studio 2013 щелкните следующую ссылку, чтобы установить пакет SDK Azure для Visual Studio 2013.

  • Если среда Visual Studio не установлена, щелкните ссылку, чтобы установить Visual Studio 2019 с пакетом SDK Azure.

Примечание

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

Загрузка и запуск готового решения

  1. Загрузите и распакуйте готовое решение.

  2. Запустите Visual Studio.

  3. В меню Файл выберите Открыть проект, перейдите к папке, куда вы скачали решение, а затем откройте файл решения.

  4. Чтобы построить решение, нажмите CTRL+SHIFT+B.

    По умолчанию Visual Studio автоматически восстанавливает содержимое пакета NuGet, которое не включено в ZIP-файл. Если пакеты не восстановлены, установите их вручную, перейдя к диалоговому окну Управление пакетами NuGet для решения и нажав кнопку Восстановить вверху справа.

  5. В обозревателе решений в качестве запускаемого проекта должен быть выбран ContosoAdsCloudService.

  6. Если вы используете Visual Studio 2015 или более поздней версии, измените строку подключения SQL Server в файле приложения Web.config в проекте ContosoAdsWeb и в файле ServiceConfiguration.Local.cscfg проекта ContosoAdsCloudService. В каждом файле измените (localdb)\v11.0 на (localdb)\MSSQLLocalDB.

  7. Для запуска приложения нажмите сочетание клавиш CTRL+F5.

    Когда запускаете локально проект облачной службы, Visual Studio автоматически вызывает эмулятор вычислений Azure и эмулятор хранилища Azure. Эмулятор хранилища использует ресурсы компьютера для эмуляции сред рабочей и веб-ролей. Эмулятор хранилища использует базу данных SQL Server Express LocalDB для эмуляции работы хранилища Azure в облаке.

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

    Архитектура Contoso Ads 1

  8. Нажмите кнопку Create an Ad.

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

    Изображение страницы

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

  10. Подождите немного и затем обновите страницу индексации, чтобы увидеть эскиз.

    Страница индексов

  11. Щелкните Details , чтобы увидеть рекламу в полный размер.

    Страница сведений

Приложение запущено полностью локально, без соединения с облаком. Эмулятор хранилища сохраняет очередь и данные большого двоичного объекта в базе данных SQL Server Express LocalDB, и приложение хранит данные рекламы в другой базе данных LocalDB. Entity Framework Code First автоматически создает базу данных рекламы в первый раз при обращении приложения к ней.

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

Развертывание приложения в Azure

Чтобы запустить приложение в облаке, выполните следующие действия:

  • Создайте облачную службу Azure.
  • Создайте базу данных в Базе данных SQL Azure.
  • Создайте учетную запись хранения Azure.
  • Настройте приложение так, чтобы при работе в облаке Azure оно использовало нужную базу данных.
  • Настройте приложение на использование вашей учетной записи хранения при запуске в Azure.
  • Разверните проект в облачной службе Azure.

Создание облачной службы Azure

Облачная служба Azure — это среда, в которой запускают приложение.

  1. В браузере откройте портал Azure.

  2. Последовательно выберите "Создать ресурс" > "Вычисления" > "Облачная служба".

  3. В поле ввода DNS-имени введите префикс URL-адреса для облачной службы.

    Этот URL-адрес должен быть уникальным. Если выбранный префикс уже используется, появится сообщение об ошибке.

  4. Укажите новую группу ресурсов для службы. Щелкните Создать, а затем введите имя группы ресурсов в поле ввода, например CS_contososadsRG.

  5. Задайте регион, в котором требуется развернуть приложение.

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

  6. Нажмите кнопку Создать.

    На следующем рисунке показано, как создается облачная служба с использованием URL-адреса CSvccontosoads.cloudapp.net.

    Изображение процесса создания облачной службы

Создание базы данных в службе "База данных SQL Azure"

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

  1. На портале Azure последовательно выберите "Создать ресурс" > "Базы данных" > "База данных SQL".

  2. В поле Имя базы данных введите contosoads.

  3. В разделе Группа ресурсов щелкните Использовать существующий и выберите группу ресурсов, используемую для облачной службы.

  4. Щелкните Сервер —Настроить обязательные параметры и Создать сервер, как показано на следующем рисунке.

    Туннель к серверу базы данных

    Если в подписке уже есть сервер, можно выбрать его в раскрывающемся списке.

  5. В поле Имя сервера введите csvccontosodbserver.

  6. Введите имя для входа в систему и пароль администратора.

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

  7. Выберите то же расположение, что и для облачной службы.

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

  8. Проверьте Разрешить службам Azure доступ к серверу.

  9. Нажмите кнопку Выбрать для нового сервера.

    Новый сервер

  10. Нажмите кнопку Создать.

Создание учетной записи хранения Azure

Учетная запись хранилища Azure обеспечивает ресурсы для хранения данных очередей и больших двоичных объектов в облаке.

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

  1. На портале Azure последовательно выберите "Создать ресурс" > "Хранилище" > "Учетная запись хранения — большой двоичный объект, файл, таблица, очередь".

  2. В поле ввода Имя введите префикс URL-адреса.

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

  3. Задайте классическуюмодель развертывания.

  4. В раскрывающемся списке Репликация установите значение Locally redundant storage (Локально избыточное хранилище).

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

  5. В разделе Группа ресурсов щелкните Использовать существующий и выберите группу ресурсов, используемую для облачной службы.

  6. В раскрывающемся списке Расположение выберите тот же регион, который выбрали для облачной службы.

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

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

  7. Нажмите кнопку Создать.

    Новая учетная запись хранения

    На следующем рисунке показано создание учетной записи хранилища с URL-адресом csvccontosoads.core.windows.net.

Настройте приложение так, чтобы при работе в облаке Azure оно использовало нужную базу данных в Базе данных SQL Azure.

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

Мы используем преобразование Web.config для веб-роли и настройку среды облачной службы для рабочей роли.

Примечание

В этом и следующем разделах учетные данные будут сохранены в файлах проектов. Не сохраняйте важные данные в общедоступном репозитории исходного кода.

  1. В проекте ContosoAdsWeb откройте файл преобразования Web.Release.config для файла приложения Web.config, удалите блок комментариев, содержащий элемент <connectionStrings>, и вставьте вместо него следующий код.

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="{connectionstring}"
        providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
    

    Оставьте файл открытым для редактирования.

  2. На портале Azure в области слева щелкните Базы данных SQL, выберите базу данных, созданную для этого руководства, а затем щелкните Показать строки подключения.

    Показать строки подключения

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

    Строки подключения

  3. В файле преобразования Web.Release.config удалите {connectionstring} и вставьте на это место строку подключения ADO.NET с портала Azure.

  4. В строке подключения, вставленной в файл преобразования Web.Release.config, замените {your_password_here} паролем, созданным для новой базы данных SQL.

  5. Сохраните файл.

  6. Выберите и скопируйте строку подключения (без знаков кавычек) для использования на следующих шагах настройки проекта с рабочей ролью.

  7. В обозревателе решений в разделе Роли в проекте облачной службы щелкните правой кнопкой мыши пункт ContosoAdsWorker и выберите Свойства.

    Снимок экрана: пункт меню

  8. Перейдите на вкладку Параметры .

  9. В раскрывающемся списке Конфигурация службы выберите значение Облако.

  10. Выберите поле Значение для параметра ContosoAdsDbConnectionString и вставьте строку подключения, которую скопировали в предыдущем разделе руководства.

    Строка подключения базы данных для рабочей роли

  11. Сохраните изменения.

Настройка приложения для использования вашей учетной записи хранения при запуске в Azure

Строки подключения учетной записи хранения Azure для проектов рабочей роли и веб-роли сохраняются в настройках среды в проекте облачной службы. Для каждого проекта используется отдельный набор настроек, если приложение запущено локально или в облаке. Следует обновить настройки облачной среды для проектов рабочей роли и веб-роли.

  1. В обозревателе решений щелкните правой кнопкой мыши пункт ContosoAdsWeb в области Роли проекта ContosoAdsCloudService, а затем выберите Свойства.

    Изображение со свойствами роли

  2. Щелкните вкладку Параметры и в раскрывающемся списке Конфигурация службы выберите Облако.

    Конфигурация облака

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

    Откройте окно создания строки подключения

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

    Создайте строку подключения хранилища

  5. Сохраните изменения.

  6. Следуйте той же процедуре, которую использовали для строки подключения StorageConnectionString, чтобы задать строку подключения Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString.

    Эта строка подключения используется для журнала.

  7. Выполните ту же процедуру, которую использовали для роли ContosoAdsWeb, чтобы задать строки подключения для роли ContosoAdsWorker. В раскрывающемся списке Конфигурация службы выберите значение Облако.

Настройки среды роли, которые были заданы с использованием интерфейса Visual Studio, сохраняются в следующих файлах в проекте ContosoAdsCloudService:

  • ServiceDefinition.csdef - определяет имена настроек.
  • ServiceConfiguration.Cloud.cscfg - предоставляет значения для приложения при запуске в облаке.
  • ServiceConfiguration.Cloud.cscfg - предоставляет значения для приложения при локальном запуске.

Например, ServiceDefinition.csdef включает следующие определения:

<ConfigurationSettings>
    <Setting name="StorageConnectionString" />
    <Setting name="ContosoAdsDbConnectionString" />
</ConfigurationSettings>

Файл ServiceConfiguration.Cloud.cscfg включает значения, которые были введены для этих настроек в Visual Studio:

<Role name="ContosoAdsWorker">
    <Instances count="1" />
    <ConfigurationSettings>
        <Setting name="StorageConnectionString" value="{yourconnectionstring}" />
        <Setting name="ContosoAdsDbConnectionString" value="{yourconnectionstring}" />
        <!-- other settings not shown -->

    </ConfigurationSettings>
    <!-- other settings not shown -->

</Role>

Параметр <Instances> указывает число виртуальных машин, на которых Azure будет запускать код рабочий роли. В раздел Дальнейшие действия включены ссылки на дополнительную информацию о горизонтальном масштабировании облачной службы.

Развертывание проекта в Azure

  1. В обозревателе решений щелкните правой кнопкой мыши проект ContosoAdsCloudService и выберите пункт Опубликовать.

    Меню публикации

  2. На шаге Вход мастера публикации приложений Azure нажмите кнопку Далее.

    Этап входа

  3. На этапе Настройки мастера нажмите кнопку Далее.

    Этап настроек

    Заданные на вкладке Дополнительно значения по умолчанию подходят для работы с этим руководством. Дополнительные сведения о вкладке "Дополнительно" см. в разделе о мастере публикации приложения Azure.

  4. На этапе Сводка щелкните Опубликовать.

    Сводка действий

    В Visual Studio открывается окно Журнал действий Azure .

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

    Развертывание может занять около 5 минут и более.

    Окно журнал действий Azure

  6. После завершения развертывания щелкните URL-адрес веб-приложения для запуска приложения.

  7. Теперь можно протестировать приложение, создавая, просматривая и редактируя некоторые элементы рекламы так же, как это происходило при локальном запуске приложения.

Примечание

После завершения тестирования удалите или остановите облачную службу. Даже если облачная служба не используется, плата за нее начисляется, поскольку ресурсы виртуальной машины для нее зарезервированы. Если оставить ее работающей, любой кто найдет этот URL-адрес, сможет создать и просмотреть рекламу. На портале Azure перейдите на вкладку Обзор для облачной службы, а затем в верхней части страницы щелкните Удалить. Если необходимо временно предотвратить доступ посторонних к сайту, вместо этого щелкните Остановить . В этом случае плата будет взиматься. Можно повторить эту же процедуру для удаления базы данных SQL и учетной записи хранилища, если они больше не нужны.

Создание приложения с нуля

Если завершенное приложениееще не загружено, сделайте это сейчас. Скопируйте файлы из загруженного проекта в новый проект.

Создание приложения Contoso Ads состоит из следующих шагов:

  • Создайте новое решение облачной службы в Visual Studio.
  • Обновите и добавьте пакеты NuGet.
  • Указание ссылок на проекты.
  • Настройте строки подключения.
  • Добавьте файлы кода.

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

Создайте новое решение облачной службы в Visual Studio

  1. В Visual Studio выберите Новый проект from the Файл .

  2. В диалоговом окне Создание проекта в области слева разверните раздел Visual C#, выберите шаблоны Облако и шаблон Облачная служба Azure.

  3. Присвойте проекту имя ContosoAdsCloudService и нажмите кнопку ОК.

    Создать проект

  4. В диалоговом окне Новая облачная служба Azure добавьте веб-роль и рабочую роль. Присвойте веб-роли имя ContosoAdsWeb, а рабочей роли — ContosoAdsWorker. (Используйте значок карандаша на правой панели для изменения имен ролей по умолчанию.)

    Проект новой облачной службы

  5. Когда появится диалоговое окно Новый проект ASP.NET для веб-роли, выберите шаблон MVC и щелкните Изменить проверку подлинности.

    Измените метод проверки подлинности

  6. В диалоговом окне Изменение проверки подлинности щелкните Без проверки подлинности и нажмите кнопку ОК.

    Без аутентификации

  7. В диалоговом окне Новый проект ASP.NET нажмите кнопку ОК.

  8. В обозревателе решений щелкните правой кнопкой мыши решение (не проект) и выберите Добавить новый проект.

  9. В диалоговом окне Добавить новый проект выберите Windows в разделе Visual C# на панели слева, а затем щелкните шаблон Библиотека классов.

  10. Присвойте проекту имя ContosoAdsCommonи нажмите кнопку ОК.

    Необходимо сослаться на контекст и модель данных Entity Framework в обоих проектах — веб-роли и рабочей роли. Как вариант, можно определить связанные с EF классы в проекте веб-роли и сослаться на этот проект из проекта рабочей роли. Но в случае альтернативного метода в проекте рабочей роли будет ссылка на веб-сборки, которые ему не нужны.

Обновите и добавьте пакеты NuGet

  1. Откройте диалоговое окно Управление пакетами NuGet для решения.

  2. В верхней части окна выберите пункт Обновления.

  3. Найдите пакет WindowsAzure.Storage и, если он есть в списке, выберите его и выберите веб-проект и проект рабочей роли для обновления пакета в этих проектах, а затем нажмите кнопку Обновить.

    Клиентская библиотека хранилища обновляется чаще, чем шаблоны проектов Visual Studio, поэтому часто происходит так, что версию во вновь создаваемых проектах необходимо обновить.

  4. В верхней части окна выберите пункт Обзор.

  5. Найдите пакет NuGet EntityFramework и установите его во все проекты.

  6. Найдите пакет NuGet Microsoft.WindowsAzure.ConfigurationManager и установите его в проект рабочей роли.

Установите ссылки проекта

  1. Задайте в проекте ContosoAdsWeb ссылку на проект ContosoAdsCommon. Щелкните правой кнопкой мыши проект ContosoAdsWeb и выберите пункты Ссылки - Добавление ссылок. В диалоговом окне Диспетчер ссылок выберите пункты Решение — Проекты на панели слева, щелкните ContosoAdsCommon, а затем нажмите кнопку ОК.

  2. Задайте в проекте ContosoAdsWorker ссылку на проект ContosoAdsCommon.

    ContosoAdsCommon будет содержать модель данных и контекстный класс Entity Framework, который будет использован как фоновой, так и интерфейсной службой.

  3. Задайте в проекте ContosoAdsWorker ссылку на System.Drawing.

    Сборка используется внутренней службой для преобразования изображений в эскизы.

Настройка строк подключения

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

  1. В проекте ContosoAdsWeb откройте файл приложения Web.config и вставьте следующий элемент connectionStrings после элемента configSections:

    <connectionStrings>
        <add name="ContosoAdsContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Если вы используете Visual Studio 2015 или более поздней версии, замените v11.0 на MSSQLLocalDB.

  2. Сохраните изменения.

  3. В проекте ContosoAdsCloudService щелкните правой кнопкой мыши ContosoAdsWeb в разделе Роли, а затем выберите Свойства.

    Изображение свойств роли

  4. В окне свойств ContosoAdsWeb [роль] щелкните вкладку Настройки и затем щелкните Добавить настройку.

    В раскрывающемся списке Конфигурация службы выберите значение Все конфигурации.

  5. Добавьте настройку с именем StorageConnectionString. Задайте для параметра Тип значение ConnectionString, а для параметра ЗначениеUseDevelopmentStorage=true.

    Новая строка подключения

  6. Сохраните изменения.

  7. Следуйте этой же процедуре для добавления строки подключения хранилища в свойства роли ContosoAdsWorker.

  8. Там же в окне свойств ContosoAdsWorker [роль] добавьте другую строку подключения:

    • Имя: ContosoAdsDbConnectionString

    • Тип: строка

    • Значение. Вставьте ту же строку подключения, которая была использована для проекта веб-роли. (Этот пример предназначен для Visual Studio 2013, не забудьте изменить источник данных при копировании этого примера для Visual Studio 2015 или более поздней версии.)

      Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;
      

Добавление файлов кода

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

Чтобы добавить файлы в проект или папку, щелкните правой кнопкой мыши проект или папку и нажмите Добавить - Существующий элемент. Выберите необходимые файлы и щелкните Добавить. При запросе о том, заменять ли существующие файлы, щелкните Да.

  1. В проекте ContosoAdsCommon удалите файл Class1.cs и добавьте на его место файлы Ad.cs и ContosoAdscontext.cs из скачанного проекта.

  2. В проекте ContosoAdsCommon добавьте следующие файлы из загруженного проекта.

    • Global.asax.cs.
    • В папку Views\Shared: файл _Layout.cshtml.
    • В папку Views\Home: файл Index.cshtml.
    • В папку Controllers: файл AdController.cs.
    • В папку Views\Ad (сначала создайте эту папку): пять файлов CSHTML.
  3. В проекте ContosoAdsCommon добавьте WorkerRole.cs из загруженного проекта.

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

В следующих разделах объясняется код, связанный с работой среды Azure, больших двоичных объектов и очередей. В этом учебнике не представлены следующие пошаговые инструкции: "Создание контроллеров и представлений MVC с помощью формирования шаблонов", "Запись кода Entity Framework, который работает с базами данных SQL Server" или "Основы асинхронного программирования в ASP.NET 4.5". Дополнительные сведения см. в следующих статьях:

ContosoAdsCommon - Ad.cs

Файл Ad.cs определяет перечисляемый тип для класса Ad и класс сущностей POCO для информации в рекламе.

public enum Category
{
    Cars,
    [Display(Name="Real Estate")]
    RealEstate,
    [Display(Name = "Free Stuff")]
    FreeStuff
}

public class Ad
{
    public int AdId { get; set; }

    [StringLength(100)]
    public string Title { get; set; }

    public int Price { get; set; }

    [StringLength(1000)]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [StringLength(1000)]
    [DisplayName("Full-size Image")]
    public string ImageURL { get; set; }

    [StringLength(1000)]
    [DisplayName("Thumbnail")]
    public string ThumbnailURL { get; set; }

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime PostedDate { get; set; }

    public Category? Category { get; set; }
    [StringLength(12)]
    public string Phone { get; set; }
}

ContosoAdsCommon - ContosoAdsContext.cs

Класс ContosoAdsContext указывает, что класс Ad используется коллекцией DbSet, которую Entity Framework хранит в базе данных SQL.

public class ContosoAdsContext : DbContext
{
    public ContosoAdsContext() : base("name=ContosoAdsContext")
    {
    }
    public ContosoAdsContext(string connString)
        : base(connString)
    {
    }
    public System.Data.Entity.DbSet<Ad> Ads { get; set; }
}

Класс имеет два конструктора. Первый из них используется веб-проектом и указывает имя строки подключения, которая сохранена в файле Web.config Второй конструктор дает возможность передачи действующей строки подключения, которая используется проектом рабочей роли, так как она не имеет файла Web.config. Ранее было показано, где хранится строка подключения, а потом будет показано, как код извлекает строку подключения, когда он создает экземпляр класса DbContext.

ContosoAdsWeb - Global.asax.cs

Код, который вызывается из метода Application_Start, создает контейнер больших двоичных объектов images и очередь images, если они отсутствуют. Это гарантирует, что при начале использования новой учетной записи хранения или эмулятора хранилища на новом компьютере требуемый контейнер больших двоичных объектов и очередь создаются автоматически.

Код получает доступ к учетной записи хранилища, используя строку подключения из файла .cscfg .

var storageAccount = CloudStorageAccount.Parse
    (RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

Затем он получает ссылку на контейнер больших двоичных объектов images , создает контейнер, если он еще не существует, и устанавливает разрешения доступа к новому контейнеру. По умолчанию новые контейнеры разрешают доступ к большим двоичным объектам только клиентам с данными учетной записи хранения. Веб-сайту требуются общедоступные большие двоичные объекты, чтобы он мог выводить изображения с использованием URL-адресов, которые указывают на объекты изображений.

var blobClient = storageAccount.CreateCloudBlobClient();
var imagesBlobContainer = blobClient.GetContainerReference("images");
if (imagesBlobContainer.CreateIfNotExists())
{
    imagesBlobContainer.SetPermissions(
        new BlobContainerPermissions
        {
            PublicAccess =BlobContainerPublicAccessType.Blob
        });
}

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

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
var imagesQueue = queueClient.GetQueueReference("images");
imagesQueue.CreateIfNotExists();

ContosoAdsWeb — _Layout.cshtml

Файл _Layout.cshtml задает имя приложения в заголовке и нижнем колонтитуле и создает запись меню "Ads".

ContosoAdsWeb - Views\Home\Index.cshtml

Файл Views\Home\Index.cshtml выводит ссылки категорий на домашней странице. Ссылки передают целочисленное значение перечисляемого типа Category в переменную querystring на странице индекса Ads.

<li>@Html.ActionLink("Cars", "Index", "Ad", new { category = (int)Category.Cars }, null)</li>
<li>@Html.ActionLink("Real estate", "Index", "Ad", new { category = (int)Category.RealEstate }, null)</li>
<li>@Html.ActionLink("Free stuff", "Index", "Ad", new { category = (int)Category.FreeStuff }, null)</li>
<li>@Html.ActionLink("All", "Index", "Ad", null, null)</li>

ContosoAdsWeb - AdController.cs

В файле AdController.cs конструктор вызывает метод InitializeStorage для создания объектов клиентской библиотеки службы хранилища Azure, которые предоставляют API-интерфейс для работы с большими двоичными объектами и очередями.

Затем код получает ссылку на контейнер больших двоичных объектов images, как показано ранее в Global.asax.cs. При этом он устанавливает политику повторения по умолчанию, подходящую для веб-приложения. По умолчанию используется политика повтора с экспоненциальной задержкой, из-за которой веб-приложение может более минуты не отвечать на многократные повторные запросы во время кратковременного сбоя. Политика повторения здесь указывает ожидание в три секунды после каждой попытки, всего до трех повторений.

var blobClient = storageAccount.CreateCloudBlobClient();
blobClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesBlobContainer = blobClient.GetContainerReference("images");

Аналогичный код получает ссылку на очередь images .

CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queueClient.DefaultRequestOptions.RetryPolicy = new LinearRetry(TimeSpan.FromSeconds(3), 3);
imagesQueue = queueClient.GetQueueReference("images");

Большая часть кода контроллера обычна для работы с моделью данных Entity Framework с использованием класса DbContext. Исключением является метод Create HttpPost, который отправляет файл и сохраняет его в хранилище больших двоичных объектов. Связыватель модели предоставляет объект HttpPostedFileBase для метода.

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create(
    [Bind(Include = "Title,Price,Description,Category,Phone")] Ad ad,
    HttpPostedFileBase imageFile)

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

if (imageFile != null && imageFile.ContentLength != 0)
{
    blob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = blob.Uri.ToString();
}

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

private async Task<CloudBlockBlob> UploadAndSaveBlobAsync(HttpPostedFileBase imageFile)
{
    string blobName = Guid.NewGuid().ToString() + Path.GetExtension(imageFile.FileName);
    CloudBlockBlob imageBlob = imagesBlobContainer.GetBlockBlobReference(blobName);
    using (var fileStream = imageFile.InputStream)
    {
        await imageBlob.UploadFromStreamAsync(fileStream);
    }
    return imageBlob;
}

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

string queueMessageString = ad.AdId.ToString();
var queueMessage = new CloudQueueMessage(queueMessageString);
await queue.AddMessageAsync(queueMessage);

Код для метода HttpPost Edit аналогичен, за одним исключением — если пользователь выбирает новый файл изображения, все существующие большие двоичные объекты должны быть удалены.

if (imageFile != null && imageFile.ContentLength != 0)
{
    await DeleteAdBlobsAsync(ad);
    imageBlob = await UploadAndSaveBlobAsync(imageFile);
    ad.ImageURL = imageBlob.Uri.ToString();
}

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

private async Task DeleteAdBlobsAsync(Ad ad)
{
    if (!string.IsNullOrWhiteSpace(ad.ImageURL))
    {
        Uri blobUri = new Uri(ad.ImageURL);
        await DeleteAdBlobAsync(blobUri);
    }
    if (!string.IsNullOrWhiteSpace(ad.ThumbnailURL))
    {
        Uri blobUri = new Uri(ad.ThumbnailURL);
        await DeleteAdBlobAsync(blobUri);
    }
}
private static async Task DeleteAdBlobAsync(Uri blobUri)
{
    string blobName = blobUri.Segments[blobUri.Segments.Length - 1];
    CloudBlockBlob blobToDelete = imagesBlobContainer.GetBlockBlobReference(blobName);
    await blobToDelete.DeleteAsync();
}

ContosoAdsWeb - Views\Ad\Index.cshtml и Details.cshtml

Файл Index.cshtml выводит эскиз с другими данными рекламы.

<img src="@Html.Raw(item.ThumbnailURL)" />

Файл Details.cshtml выводит изображение в полном размере.

<img src="@Html.Raw(Model.ImageURL)" />

ContosoAdsWeb - Views\Ad\Create.cshtml и Edit.cshtml

Файлы Create.cshtml и Edit.cshtml указывают кодирование формы, которое дает возможность контроллеру получить объект HttpPostedFileBase.

@using (Html.BeginForm("Create", "Ad", FormMethod.Post, new { enctype = "multipart/form-data" }))

Элемент <input> сообщает браузеру, что нужно открыть диалоговое окно выбора файла.

<input type="file" name="imageFile" accept="image/*" class="form-control fileupload" />

ContosoAdsWorker - WorkerRole.cs - метод OnStart

Среда рабочей роли Azure вызывает метод OnStart в классе WorkerRole, когда рабочая роль начинает работу, и вызывает метод Run, когда метод OnStart завершает работу.

Метод OnStart получает строку подключения к базе данных из CSCFG-файла и передает ее в класс Entity Framework DbContext. Поставщик SQLClient используется по умолчанию, поэтому поставщик не нужно указывать.

var dbConnString = CloudConfigurationManager.GetSetting("ContosoAdsDbConnectionString");
db = new ContosoAdsContext(dbConnString);

Затем метод получит ссылку на учетную запись хранилища и создаст контейнер больших двоичных объектов и очередь, если они не существуют. Этот код аналогичен тому, что показан в методе Application_Start веб-роли.

ContosoAdsWorker - WorkerRole.cs - метод Run

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

public override void Run()
{
    CloudQueueMessage msg = null;

    while (true)
    {
        try
        {
            msg = this.imagesQueue.GetMessage();
            if (msg != null)
            {
                ProcessQueueMessage(msg);
            }
            else
            {
                System.Threading.Thread.Sleep(1000);
            }
        }
        catch (StorageException e)
        {
            if (msg != null && msg.DequeueCount > 5)
            {
                this.imagesQueue.DeleteMessage(msg);
            }
            System.Threading.Thread.Sleep(5000);
        }
    }
}

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

Иногда содержимое сообщения очереди вызывает ошибку при обработке. Это ядовитое сообщение — если ошибка только протоколируется и цикл будет перезапущен, то сообщение можно обрабатывать бесконечно. Поэтому блок catch включает правило if, которое проверяет, сколько раз приложение пыталось обработать текущее сообщение. Если уже насчитано 5 раз, сообщение удаляется из очереди.

ProcessQueueMessage вызывается, когда сообщение найдено в очереди.

private void ProcessQueueMessage(CloudQueueMessage msg)
{
    var adId = int.Parse(msg.AsString);
    Ad ad = db.Ads.Find(adId);
    if (ad == null)
    {
        throw new Exception(String.Format("AdId {0} not found, can't create thumbnail", adId.ToString()));
    }

    CloudBlockBlob inputBlob = this.imagesBlobContainer.GetBlockBlobReference(ad.ImageURL);

    string thumbnailName = Path.GetFileNameWithoutExtension(inputBlob.Name) + "thumb.jpg";
    CloudBlockBlob outputBlob = this.imagesBlobContainer.GetBlockBlobReference(thumbnailName);

    using (Stream input = inputBlob.OpenRead())
    using (Stream output = outputBlob.OpenWrite())
    {
        ConvertImageToThumbnailJPG(input, output);
        outputBlob.Properties.ContentType = "image/jpeg";
    }

    ad.ThumbnailURL = outputBlob.Uri.ToString();
    db.SaveChanges();

    this.imagesQueue.DeleteMessage(msg);
}

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

Примечание

Для простоты код в методе ConvertImageToThumbnailJPG использует классы в пространстве имен System.Drawing. Однако классы в этом пространстве имен были спроектированы для использования с формами Windows. Они не поддерживаются в службе Windows или ASP.NET. Дополнительные сведения о параметрах обработки изображений см. в статьях Back to Basics: Dynamic Image Generation, ASP.NET Controllers, Routing, IHttpHandlers, and runAllManagedModulesForAllRequests (Основы: создание динамического образа, контроллеры ASP.NET, маршрутизация, IHttpHandlers и runAllManagedModulesForAllRequests) и Deep Inside Image Resizing and scaling with ASP.NET and IIS with ImageResizing.net author Nathanael (Особенности изменения размеров и масштабирования образов с использованием ASP.NET и IIS с автором ImageResizing.net Натанаэлем).

Устранение неполадок

У вас что-то не работает, когда вы выполняете инструкции из этого руководства? Вот несколько общих ошибок и способы их устранения.

ServiceRuntime.RoleEnvironmentException

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

Одной из причин, по которым приложение использует RoleEnvironment в Azure, — это получение значений строки подключения, которые что они хранятся в файлах .cscfg , поэтому другой причиной этого исключения является отсутствие строки подключения. Убедитесь, что настройка StorageConnectionString создана для вариантов "Облако" и "Локально" в проекте ContosoAdsWeb, и что созданы обе строки подключения для обоих вариантов в проекте ContosoAdsWorker. Выполните поиск Найти все по StorageConnectionString во всем решении; запись должна появиться 9 раз в 6 файлах.

Невозможно переопределить на порт ххх. Новый порт ниже минимально разрешенного значения 8080 для протокола http

Попробуйте изменить номер порта, используемый веб-проектом. Щелкните правой кнопкой мыши проект ContosoAdsWeb и выберите пункт Свойства. Щелкните вкладку Веб и измените номер порта в параметре URL-адрес проекта.

Другой вариант решения задачи описан в следующем разделе.

Другие ошибки при работе локально

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

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

Для запуска приложения с полным эмулятором следует открыть Visual Studio с правами администратора.

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

Приложение Contoso Ads намеренно сделано простым для руководства по началу работы. Например, оно не реализует вставку зависимостей или репозиторий и блок рабочих шаблонов, не использует интерфейс для журналов, не использует EF Code First Migrations для управления изменениями модели данных или EF Connection Resiliency для управления кратковременными ошибками сети и т. д.

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

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

Видеоинструкции по рекомендациям для службы хранилища Azure см. в разделе Microsoft Azure Storage – What's New, Best Practices and Patterns (Хранилище Microsoft — новости, рекомендации и шаблоны).

Дополнительные сведения см. в следующих ресурсах: