Поделиться через


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

Обзор

Это важно

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

В этом руководстве показано, как создать многоуровневое приложение .NET с интерфейсом ASP.NET Model-View-Controller (MVC) и развернуть его в облачной службе Azure. Приложение использует базу данных Azure SQL, службу BLOB-объектов Azure и службу очередей Azure. Проект Visual Studio можно скачать из коллекции кода Microsoft Developer Network (MSDN).

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

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

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

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

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

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

Это руководство описывает, как запускать фоновые и интерфейсные компоненты в облачной службе Azure. Альтернативой является запуск интерфейсной части в Службе приложений Azure и использование функции Веб-задания для серверной части. Чтобы ознакомиться с руководством, использующим веб-задания, см. статью Начало работы с Azure WebJobs SDK. Чтобы получить информацию о том, как выбрать службы, которые наилучшим образом подходят для вашего сценария, см. сравнение службы приложений, облачных служб и виртуальных машин Azure.

Цели обучения

  • Как подготовить компьютер к разработке для Azure путем установки пакета Azure SDK.
  • Как создать облачный проект Visual Studio с веб-ролью 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-адреса: один для полноразмерного изображения, другой для эскиза.

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

Когда пользователь загружает изображение, фронтенд, работающий в веб-роли, сохраняет его в объект Blob в 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. Выберите "Создать объявление".

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

    Изображение показывает страницу

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

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

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

  11. Выберите сведения о объявлении, чтобы просмотреть изображение полного размера.

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

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

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

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

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

  • Создайте облачную службу Azure.
  • Создайте базу данных в Базе данных SQL Azure.
  • Создание учетной записи хранения 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 обеспечивает ресурсы для хранения данных очередей и файлов BLOB в облаке.

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

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

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

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

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

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

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

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

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

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

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

  7. Выберите Создать.

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

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

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

Веб-проект и проект рабочей роли имеют свои собственные строки подключения к базе данных, и каждое из них должно указывать на базу данных Azure SQL Database, когда приложение запущено в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • ServiceDefinition.csdef - определяет имена настроек.
  • ServiceConfiguration.Cloud.cscfg - предоставляет значения для приложения при запуске в облаке.
  • ServiceConfiguration.Local.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 выберите Новый проект из меню Файл.

  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 [Role] выберите вкладку "Параметры" и нажмите кнопку "Добавить параметр".

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

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

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

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

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

  8. Находясь все еще в окне свойств ContosoAdsWorker [Role], добавьте еще одну строку подключения.

    • Имя: 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. В проекте ContosoAdsWeb добавьте следующие файлы из загруженного проекта.

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

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

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

ContosoAdsCommon - Ad.cs

Файл Ad.cs определяет перечисляемый тип для категорий объявлений и класс сущности 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"));

Затем он получает ссылку на контейнер BLOB images, создает контейнер, если он еще не существует, и настраивает права доступа на новый контейнер. По умолчанию новые контейнеры разрешают доступ к объектам BLOB только клиентам с учетными данными учетной записи хранения. Веб-сайту нужны общедоступные BLOB-объекты, чтобы он мог отображать изображения, используя 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 в переменную строки запроса на странице индекса объявлений.

<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 Storage, которые предоставляют 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 загружает объект Blob и обновляет базу данных, он создает сообщение очереди, чтобы сообщить фоновому процессу, что изображение готово для преобразования в эскиз.

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 рассказывает историю о разработчике, который забыл включить эту функцию сна, развернул приложение в рабочей среде и уехал в отпуск. Вернувшись, он обнаружил, что эта забывчивость обошлась ему дороже всего отпуска.

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

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 во всем решении, вы должны увидеть его девять раз в шести файлах.

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

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

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

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

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

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

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

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

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

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

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