Начало работы с Облачными службами 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. Альтернативой является запуск интерфейсной части в Службе приложений 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 уже имеется на компьютере, его установка может занять определенное время (от нескольких минут до получаса или более).
Загрузка и запуск готового решения
Загрузите и распакуйте готовое решение.
Запустите Visual Studio.
В меню Файл выберите Открыть проект, перейдите к папке, куда вы скачали решение, а затем откройте файл решения.
Для построения решения нажмите CTRL+SHIFT+B.
По умолчанию Visual Studio автоматически восстанавливает содержимое пакета NuGet, которое не было включено в файл .zip . Если пакеты не восстановлены, установите их вручную, перейдя к диалоговому окну Управление пакетами NuGet для решения и нажав кнопку Восстановить вверху справа.
В обозревателе решений в качестве запускаемого проекта должен быть выбран ContosoAdsCloudService.
Если вы используете Visual Studio 2015 или более поздней версии, измените строку подключения SQL Server в файле приложения Web.config в проекте ContosoAdsWeb и в файле ServiceConfiguration.Local.cscfg проекта ContosoAdsCloudService. В каждом файле измените (localdb)\v11.0 на (localdb)\MSSQLLocalDB.
Чтобы запустить приложение, нажмите клавиши CTRL+F5.
Когда запускаете локально проект облачной службы, Visual Studio автоматически вызывает эмулятор вычислений Azure и эмулятор хранилища Azure. Эмулятор хранилища использует ресурсы компьютера для эмуляции сред рабочей и веб-ролей. Эмулятор хранилища использует базу данных SQL Server Express LocalDB для эмуляции работы хранилища Azure в облаке.
При первом запуске проекта облачной службы, запуск эмулятора займет порядка одной минуты. После завершения работы эмулятора стандартный браузер открывается с домашней страницей приложения.
Выберите "Создать объявление".
Введите некоторые тестовые данные и выберите .jpg изображение для отправки, а затем нажмите кнопку "Создать".
Приложение переходит на страницу индекса, но не отображает эскиз для новой рекламы, так как эта обработка еще не произошла.
Подождите немного и затем обновите страницу индексации, чтобы увидеть эскиз.
Выберите сведения о объявлении, чтобы просмотреть изображение полного размера.
Приложение запущено полностью локально, без соединения с облаком. Эмулятор хранилища сохраняет очередь и данные большого двоичного объекта в базе данных SQL Server Express LocalDB, и приложение хранит данные рекламы в другой базе данных LocalDB. Entity Framework Code First автоматически создает базу данных рекламы в первый раз при обращении приложения к ней.
В следующем разделе описана настройка решения для использования облачных ресурсов Azure для очередей, больших двоичных объектов и базы данных приложения при запуске в облаке. При желании можно запускать приложение локально и далее, но можно делать это, используя облачные ресурсы хранилища и базы данных. Это просто вопрос настройки строка подключения, которые вы видите, как это сделать.
Развертывание приложения в Azure
Чтобы запустить приложение в облаке, выполните следующие действия.
- Создайте облачную службу Azure.
- Создайте базу данных в Базе данных SQL Azure.
- Создание учетной записи хранения Azure.
- Настройте приложение так, чтобы при работе в облаке Azure оно использовало нужную базу данных.
- Настройте приложение на использование вашей учетной записи хранения при запуске в Azure.
- Разверните проект в облачной службе Azure.
Создание облачной службы Azure
Облачная служба Azure — это среда, в которой выполняется приложение.
В браузере откройте портал Azure.
Выберите "Создать облачную службу вычислений > ресурсов>".
В поле ввода имени системы доменных имен (DNS) введите префикс URL-адреса для облачной службы.
Этот URL-адрес должен быть уникальным. Если выбранное префикс уже используется, появится сообщение об ошибке.
Укажите новую группу ресурсов для службы. Выберите " Создать" и введите имя в поле ввода группы ресурсов, например CS_contososadsRG.
Задайте регион, в котором требуется развернуть приложение.
Это поле указывает, в каком центре обработки данных размещена облачная служба. В рабочем приложении следует выбрать регион, ближайший к заказчикам. Выберите здесь ближайший к вам регион.
Нажмите кнопку создания.
На следующем рисунке показано, как создается облачная служба с использованием URL-адреса CSvccontosoads.cloudapp.net.
Создание базы данных в службе "База данных SQL Azure"
При запуске приложения в облаке используется облачная база данных.
В портал Azure выберите "Создать базы данных > ресурсов>" База данных SQL.
В поле Имя базы данных введите contosoads.
В группе ресурсов выберите "Использовать существующую" и выберите группу ресурсов, используемую для облачной службы.
На следующем изображении выберите сервер — настройка необходимых параметров и создание нового сервера.
Если в подписке уже есть сервер, можно выбрать его в раскрывающемся списке.
В поле Имя сервера введите csvccontosodbserver.
Введите имя для входа в систему и пароль администратора.
Если вы выбрали Создать сервер, не используйте имеющиеся имя и пароль. Введите новые имя и пароль, которые в дальнейшем будут использоваться при обращении к базе данных. Если вы выбрали созданный ранее сервер, портал запрашивает пароль для уже созданной учетной записи администратора.
Выберите то же расположение, что и для облачной службы.
Если облачная служба и база данных находятся в разных центрах обработки данных (в разных регионах), задержка увеличивается, а плата за пропускную способность за пределами центра обработки данных взимается. Пропускная способность в рамках центра обработки данных предоставляется бесплатно.
Проверьте Разрешить службам Azure доступ к серверу.
Выберите для нового сервера.
Выберите Создать.
Создание учетной записи службы хранилища Azure
Учетная запись хранилища Azure обеспечивает ресурсы для хранения данных очередей и больших двоичных объектов в облаке.
В реальном приложении обычно создают отдельные учетные записи для данных приложения и данных журналов, а также отдельные учетные записи для тестовых данных и рабочих данных. В этом руководстве используется только одна учетная запись.
В портал Azure выберите "Создать учетную запись хранения ресурсов > >" — BLOB-объект, файл, таблицу, очередь.
В поле ввода Имя введите префикс URL-адреса.
Этот префикс плюс текст, который отображается в поле, является уникальным URL-адресом учетной записи хранения. Если вводимый префикс уже используется другим пользователем, выберите другой префикс.
Задайте классическуюмодель развертывания.
В раскрывающемся списке Репликация установите значение Locally redundant storage (Локально избыточное хранилище).
При включении георепликации для учетной записи хранения хранящиеся данные реплицируются в дополнительный центр обработки данных для обеспечения возможности отработки отказа в случае крупной аварии в основном расположении. Георепликация может потребовать дополнительных затрат. Для учетных записей тестирования и разработки оплачивать георепликацию обычно не требуется. Дополнительные сведения см. в статье Об учетных записях хранения Azure.
В группе ресурсов выберите "Использовать существующую" и выберите группу ресурсов, используемую для облачной службы.
В раскрывающемся списке Расположение выберите тот же регион, который выбрали для облачной службы.
Если облачная служба и учетная запись хранения находятся в разных центрах обработки данных (разных регионах), задержка увеличивается, а плата за пропускную способность за пределами центра обработки данных взимается. Пропускная способность в рамках центра обработки данных предоставляется бесплатно.
Территориальные группы Azure обеспечивают механизм для минимизации расстояния между ресурсами в центре обработки данных, что позволяет уменьшить задержку. В этом руководстве не используются группы сходства. Дополнительные сведения см. в разделе о создании территориальной группы в Azure.
Выберите Создать.
На следующем рисунке показано создание учетной записи хранилища с URL-адресом
csvccontosoads.core.windows.net
.
Настройте приложение так, чтобы при работе в облаке Azure оно использовало нужную базу данных в Базе данных SQL Azure.
Веб-проект и проект рабочей роли имеют свои строки подключения к базе данных, и обе они должны указывать на базу данных в Базе данных SQL Azure, когда приложение работает в Azure.
Для веб-роли и среды облачной службы для рабочей роли используется преобразование web.config.
Примечание.
В этом и следующем разделах учетные данные будут сохранены в файлах проектов. Не сохраняйте важные данные в общедоступном репозитории исходного кода.
В проекте 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>
Оставьте файл открытым для редактирования.
В портал Azure выберите База данных SQL в левой области, выберите базу данных, созданную для этого руководства, и выберите пункт "Показать строка подключения".
Портал выведет строки подключения со звездочками вместо пароля.
В файле преобразования Web.Release.config удалите
{connectionstring}
и вставьте на это место строку подключения ADO.NET с портала Azure.В строке подключения, вставленной в файл преобразования Web.Release.config, замените
{your_password_here}
паролем, созданным для новой базы данных SQL.Сохраните файл.
Выберите и скопируйте строку подключения (без знаков кавычек) для использования на следующих шагах настройки проекта с рабочей ролью.
В Обозреватель решений в разделе "Роли" в проекте облачной службы щелкните правой кнопкой мыши ContosoAdsWorker и выберите "Свойства".
Перейдите на вкладку Параметры .
В раскрывающемся списке Конфигурация службы выберите значение Облако.
Выберите поле Значение для параметра
ContosoAdsDbConnectionString
и вставьте строку подключения, которую скопировали в предыдущем разделе руководства.Сохранение изменений.
Настройка приложения для использования вашей учетной записи хранения при запуске в Azure
Строки подключения учетной записи хранения Azure для проектов рабочей роли и веб-роли сохраняются в настройках среды в проекте облачной службы. Для каждого проекта существует отдельный набор параметров, используемых при локальном запуске приложения и при запуске в облаке. Параметры облачной среды обновляются как для проектов веб-, так и для рабочих ролей.
В Обозреватель решений щелкните правой кнопкой мыши ContosoAdsWeb в разделе "Роли" в проекте ContosoAdsCloudService и выберите "Свойства".
Перейдите на вкладку "Параметры ". В раскрывающемся списке "Конфигурация службы" выберите "Облако".
Выберите запись StorageConnectionString и нажмите кнопку с многоточием (...) в правой части строки. Нажмите кнопку с многоточием, чтобы открыть диалоговое окно "Создать строку подключения хранилища".
В диалоговом окне "Создать строку подключения к хранилищу" выберите подписку, выберите учетную запись хранения, созданную ранее, и нажмите кнопку "ОК". Обозреватель запрашивает учетные данные учетной записи Azure, если вам по-прежнему нужно войти.
Сохранение изменений.
Следуйте той же процедуре, которую использовали для строки подключения
StorageConnectionString
, чтобы задать строку подключенияMicrosoft.WindowsAzure.Plugins.Diagnostics.ConnectionString
.Эта строка подключения используется для журнала.
Выполните ту же процедуру, которую использовали для роли 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
В обозревателе решений щелкните правой кнопкой мыши проект ContosoAdsCloudService и выберите пункт Опубликовать.
На шаге входа мастера публикации приложение Azure нажмите кнопку "Далее".
На шаге "Параметры " мастера нажмите кнопку "Далее".
Заданные на вкладке Дополнительно значения по умолчанию подходят для работы с этим руководством. Дополнительные сведения о вкладке "Дополнительно" см. в разделе о мастере публикации приложения Azure.
На шаге "Сводка " выберите "Опубликовать".
В Visual Studio открывается окно Журнал действий Azure .
Щелкните значок стрелки вправо, чтобы развернуть сведения о развертывании.
Развертывание может занять около 5 минут и более.
Когда состояние развертывания завершится, выберите URL-адрес веб-приложения, чтобы запустить приложение.
Теперь можно протестировать приложение, создавая, просматривая и редактируя некоторые элементы рекламы так же, как это происходило при локальном запуске приложения.
Примечание.
После завершения тестирования удалите или остановите облачную службу. Даже если облачная служба не используется, плата за нее начисляется, поскольку ресурсы виртуальной машины для нее зарезервированы. Если оставить ее работающей, любой кто найдет этот URL-адрес, сможет создать и просмотреть рекламу. На портале Azure перейдите на вкладку Обзор для облачной службы, а затем в верхней части страницы щелкните Удалить. Если необходимо временно предотвратить доступ посторонних к сайту, вместо этого щелкните Остановить . В этом случае плата будет взиматься. Можно повторить эту же процедуру для удаления базы данных SQL и учетной записи хранилища, если они больше не нужны.
Создание приложения с самого начала
Если вам по-прежнему нужно скачать готовое приложение, сделайте это сейчас. Скопируйте файлы из скачаемого проекта в новый проект.
Создание приложения Contoso Ads состоит из следующих шагов:
- Создайте новое решение облачной службы в Visual Studio.
- Обновите и добавьте пакеты NuGet.
- Указание ссылок на проекты.
- Настройка строк подключения.
- Добавьте файлы кода.
После создания решения просмотрите код, уникальный для проектов облачных служб, больших двоичных объектов и очередей Azure.
Создайте новое решение облачной службы в Visual Studio
В Visual Studio выберите Новый проект from the Файл .
В диалоговом окне Создание проекта в области слева разверните раздел Visual C#, выберите шаблоны Облако и шаблон Облачная служба Azure.
Присвойте проекту и решению ContosoAdsCloudService имя и нажмите кнопку "ОК".
В диалоговом окне Новая облачная служба Azure добавьте веб-роль и рабочую роль. Присвойте веб-роли имя ContosoAdsWeb, а рабочей роли — ContosoAdsWorker. (Используйте значок карандаша на правой панели для изменения имен ролей по умолчанию.)
При появлении диалогового окна "Создать ASP.NET проект " для веб-роли выберите шаблон MVC и нажмите кнопку "Изменить проверку подлинности".
В диалоговом окне "Изменение проверки подлинности" нажмите кнопку "Нет проверки подлинности" и нажмите кнопку "ОК".
В диалоговом окне "Создать ASP.NET проект" нажмите кнопку "ОК".
В обозревателе решений щелкните правой кнопкой мыши решение (не проект) и выберите Добавить новый проект.
В диалоговом окне "Добавление нового проекта" выберите Windows в visual C# в левой области и выберите шаблон библиотеки классов.
Назовите проект ContosoAdsCommon и нажмите кнопку "ОК".
Необходимо сослаться на контекст и модель данных Entity Framework в обоих проектах — веб-роли и рабочей роли. Как вариант, можно определить связанные с EF классы в проекте веб-роли и сослаться на этот проект из проекта рабочей роли. Но в случае альтернативного метода в проекте рабочей роли будет ссылка на веб-сборки, которые ему не нужны.
Обновите и добавьте пакеты NuGet
Откройте диалоговое окно Управление пакетами NuGet для решения.
В верхней части окна выберите пункт Обновления.
Найдите пакет WindowsAzure.Storage, и если он находится в списке, выберите его и выберите веб-проекты и рабочие проекты, чтобы обновить его, а затем нажмите кнопку "Обновить".
Клиентская библиотека хранилища обновляется чаще, чем шаблоны проектов Visual Studio, поэтому вы можете обнаружить, что версия в созданном проекте должна обновляться.
В верхней части окна выберите пункт Обзор.
Найдите пакет NuGet EntityFramework и установите его во все проекты.
Найдите пакет NuGet Microsoft.WindowsAzure.ConfigurationManager и установите его в проект рабочей роли.
Установите ссылки проекта
Задайте в проекте ContosoAdsWeb ссылку на проект ContosoAdsCommon. Щелкните правой кнопкой мыши проект ContosoAdsWeb и выберите "Ссылки на добавление ссылок - ". В диалоговом окне "Диспетчер ссылок" выберите "Решение — проекты" в левой области, выберите ContosoAdsCommon и нажмите кнопку "ОК".
Задайте в проекте ContosoAdsWorker ссылку на проект ContosoAdsCommon.
ContosoAdsCommon содержит модель данных Entity Framework и класс контекста, который использует интерфейсную и серверную часть.
Задайте в проекте ContosoAdsWorker ссылку на
System.Drawing
.Сборка используется внутренней службой для преобразования изображений в эскизы.
Настройка строк подключения
В этом разделе настройте хранилище Azure и строки подключения SQL для локального тестирования. Инструкции по развертыванию ранее в этом руководстве объясняют, как установить строки подключения в случае, когда приложение работает в облаке.
В проекте 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.
Сохранение изменений.
В проекте ContosoAdsCloudService щелкните правой кнопкой мыши ContosoAdsWeb в разделе "Роли" и выберите "Свойства".
В окне свойств ContosoAdsWeb [Role] выберите вкладку "Параметры" и нажмите кнопку "Добавить параметр".
В раскрывающемся списке Конфигурация службы выберите значение Все конфигурации.
Добавьте настройку с именем StorageConnectionString. Задайте для параметра Тип значение ConnectionString, а для параметра Значение — UseDevelopmentStorage=true.
Сохранение изменений.
Следуйте этой же процедуре для добавления строки подключения хранилища в свойства роли ContosoAdsWorker.
Пока еще в окне свойств ContosoAdsWorker [Role] добавьте еще один строка подключения:
Имя: ContosoAdsDbConnectionString
Тип: строка
Значение. Вставьте ту же строку подключения, которая была использована для проекта веб-роли. (Этот пример предназначен для Visual Studio 2013, не забудьте изменить источник данных при копировании этого примера для Visual Studio 2015 или более поздней версии.)
Data Source=(localdb)\v11.0; Initial Catalog=ContosoAds; Integrated Security=True; MultipleActiveResultSets=True;
Добавление файлов кода
В этом разделе скопируйте файлы кода из скачанного решения в новое решение. В следующих разделах показаны и объясняются ключевые части этого кода.
Чтобы добавить файлы в проект или папку, щелкните правой кнопкой мыши проект или папку и выберите "Добавить - существующий элемент". Выберите нужные файлы и нажмите кнопку "Добавить". Если вы хотите заменить существующие файлы, нажмите кнопку "Да".
В проекте ContosoAdsCommon удалите файл Class1.cs и добавьте на его место файлы Ad.cs и ContosoAdscontext.cs из скачанного проекта.
В проекте ContosoAdsCommon добавьте следующие файлы из загруженного проекта.
- Global.asax.cs.
- В папку Views\Shared: файл _Layout.cshtml.
- В папку Views\Home: файл Index.cshtml.
- В папку Controllers: файл AdController.cs.
- В папку Views\Ad (сначала создайте эту папку): пять файлов CSHTML.
В проекте ContosoAdsCommon добавьте WorkerRole.cs из загруженного проекта.
Теперь вы можете создать и запустить приложение, как описано ранее в руководстве, и приложение использует локальные ресурсы базы данных и эмулятора хранилища.
В следующих разделах объясняется код, связанный с работой среды Azure, больших двоичных объектов и очередей. В этом руководстве не объясняется, как создавать контроллеры и представления MVC с помощью шаблонов, как писать код Entity Framework, который работает с базами данных SQL Server, или основы асинхронного программирования в ASP.NET 4.5. Дополнительные сведения см. в следующих статьях:
- Начало работы с MVC 5
- Начало работы с EF 6 и MVC 5
- Введение в асинхронное программирование в .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);
}
}
}
После каждой итерации цикла, если сообщение найдено в очереди, программа останавливается на секунду. Этот спящий режим предотвращает чрезмерное время ЦП и затраты на транзакцию хранилища. Группа консультантов майкрософт рассказывает историю о разработчике, который забыл включить эту функцию сна, развернутую в рабочей среде и оставленную на отпуск. Вернувшись, он обнаружил, что эта забывчивость обошлась ему дороже всего отпуска.
Иногда содержимое сообщения очереди вызывает ошибку при обработке. Этот вид сообщения называется ядным сообщением. Если вы просто зарегистрировали ошибку и перезапустили цикл, вы можете бесконечно попытаться обработать это сообщение. Таким образом, блок 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.
Дополнительные сведения см. на следующих ресурсах: