Начало работы с облачными службами Azure и ASP.NETGet started with Azure Cloud Services and ASP.NET

ОбзорOverview

Это руководство описывает, как создавать многоуровневое приложение .NET с внешним ASP.NET MVC и как развернуть его в облачной службе Azure.This tutorial shows how to create a multi-tier .NET application with an ASP.NET MVC front-end, and deploy it to an Azure cloud service. Приложение использует базу данных Azure SQL, службу BLOB-объектов Azure и службу очередей Azure.The application uses Azure SQL Database, the Azure Blob service, and the Azure Queue service. Можно загрузить проект Visual Studio из галереи кода MSDN.You can download the Visual Studio project from the MSDN Code Gallery.

В руководстве показано, как строить и запускать приложение локально, как разворачивать его в Azure и запускать в облаке и как создавать его с нуля.The tutorial shows you how to build and run the application locally, how to deploy it to Azure and run in the cloud, and how to build it from scratch. Можно начать с построения с нуля и затем выполнить шаги по тестированию и развертыванию по желанию.You can start by building from scratch and then do the test and deploy steps afterward if you prefer.

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

Приложение представляет собой рекламную доску объявлений.The application is an advertising bulletin board. Пользователи создают рекламу, вводя текст и загружая изображения.Users create an ad by entering text and uploading an image. Они могут видеть список рекламы по эскизам изображений, и они могут видеть изображения в полном размере, когда выбирают рекламу для просмотра деталей.They can see a list of ads with thumbnail images, and they can see the full-size image when they select an ad to see the details.

Список рекламы

Приложение использует рабочий шаблон на основе очередей для разгрузки процессора от задач создания эскизов в фоновом режиме.The application uses the queue-centric work pattern to off-load the CPU-intensive work of creating thumbnails to a back-end process.

Альтернативная архитектура: веб-сайты и веб-заданияAlternative architecture: Websites and WebJobs

Это руководство описывает, как запускать фоновые и интерфейсные компоненты в облачной службе Azure.This tutorial shows how to run both front-end and back-end in an Azure cloud service. Альтернативой является запуск интерфейсного компонента на веб-сайте Azure и использование веб-заданий (пока предварительной версии) для фонового компонента.An alternative is to run the front-end in an Azure website and use the WebJobs feature (currently in preview) for the back-end. Руководство по веб-заданиям см. в статье Создание веб-задания .NET в службе приложений Azure.For a tutorial that uses WebJobs, see Get Started with the Azure WebJobs SDK. Сведения о том, как выбрать службы, см. в статье о сравнении веб-сайтов, облачных служб и виртуальных машин Azure.For information about how to choose the services that best fit your scenario, see Azure Websites, Cloud Services, and virtual machines comparison.

Что вы узнаетеWhat you'll learn

  • Как подготовить компьютер к разработке для Azure путем установки пакета Azure SDK.How to enable your machine for Azure development by installing the Azure SDK.
  • Как создать облачный проект Visual Studio с веб-ролью ASP.NET MVC и рабочей ролью ASP.NET MVC.How to create a Visual Studio cloud service project with an ASP.NET MVC web role and a worker role.
  • Как тестировать локально проект облачной службы, используя эмулятор хранилища Azure.How to test the cloud service project locally, using the Azure storage emulator.
  • Как опубликовать облачный проект в облачной службе Azure и тестировать его с использованием учетной записи хранилища Azure.How to publish the cloud project to an Azure cloud service and test using an Azure storage account.
  • Как отправлять файлы и хранить их в службе BLOB-объектов Azure.How to upload files and store them in the Azure Blob service.
  • Как использовать службу очередей Azure для связи между уровнями.How to use the Azure Queue service for communication between tiers.

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

В руководстве предполагается, что вы понимаете базовые концепции облачной службы Azure, такие как термины веб-роль и рабочая роль.The tutorial assumes that you understand basic concepts about Azure cloud services such as web role and worker role terminology. Кроме того, предполагается, что вы знаете, как работать с проектами ASP.NET MVC или веб-форм в Visual Studio.It also assumes that you know how to work with ASP.NET MVC or Web Forms projects in Visual Studio. Пример приложения использует MVC, но многое в руководство также применимо к веб-формам.The sample application uses MVC, but most of the tutorial also applies to Web Forms.

Вы можете запускать приложение локально без подписки Azure, но она понадобится для развертывания приложения в облаке.You can run the app locally without an Azure subscription, but you'll need one to deploy the application to the cloud. Если у вас нет учетной записи, можно активировать преимущества для подписчиков MSDN или подписаться на бесплатную пробную версию.If you don't have an account, you can activate your MSDN subscriber benefits or sign up for a free trial.

Инструкции руководства применимы со следующими продуктами:The tutorial instructions work with either of the following products:

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

Если у вас нет ни одного из этих продуктов, Visual Studio может быть установлен автоматически при установке пакета SDK для Azure.If you don't have one of these, Visual Studio may be installed automatically when you install the Azure SDK.

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

Приложение хранит рекламу в базе данных SQL, используя Entity Framework Code First для создания таблиц и доступа к данным.The app stores ads in a SQL database, using Entity Framework Code First to create the tables and access the data. Для каждого рекламного объявления база данных хранит два URL-адреса: один для полноразмерного изображения, другой для эскиза.For each ad, the database stores two URLs, one for the full-size image and one for the thumbnail.

Таблица рекламы

Когда пользователь отправляет изображение, внешнее приложение, работающее в веб-роли, сохраняет его в большой двоичный объект Azure, а информацию о рекламе с URL-адресом, который указывает на большой двоичный объект, — в базе данных.When a user uploads an image, the front-end running in a web role stores the image in an Azure blob, and it stores the ad information in the database with a URL that points to the blob. В это же время оно записывает сообщение в очередь Azure.At the same time, it writes a message to an Azure queue. Фоновый процесс, работающий в рабочей роли, периодически опрашивает очередь о новых сообщениях.A back-end process running in a worker role periodically polls the queue for new messages. Когда появляется новое сообщение, рабочая роль создает эскиз для изображения и обновляет поле базы данных с URL-адресом эскиза для этой рекламы.When a new message appears, the worker role creates a thumbnail for that image and updates the thumbnail URL database field for that ad. На схеме ниже показано, как взаимодействуют части приложения.The following diagram shows how the parts of the application interact.

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

Настройка среды разработкиSet up the development environment

Для начала настройте среду разработки с помощью Visual Studio и пакета SDK Azure.To start, set up your development environment with Visual Studio and the Azure SDK.

  • Visual Studio 2017 включает в себя пакет SDK Azure.Visual Studio 2017 includes the Azure SDK. Если вы используете Visual Studio 2017, для среды разработки не требуются дополнительные настройки.If you're using VS2017, no additional setup is needed for the development environment.
  • Для Visual Studio 2015 щелкните следующую ссылку, чтобы установить пакет SDK Azure для Visual Studio 2015.For Visual Studio 2015, click the following link to install the Azure SDK for Visual Studio 2015.
  • Для Visual Studio 2013 щелкните следующую ссылку, чтобы установить пакет SDK Azure для Visual Studio 2013.For Visual Studio 2013, click the following link to install the Azure SDK for Visual Studio 2013.

  • Если среда Visual Studio не установлена, щелкните ссылку, чтобы установитьVisual Studio 2017 с помощью пакета SDK Azure.If you don't have Visual Studio installed, use the following to install Visual Studio 2017 with the Azure SDK.

Примечание

В зависимости от того, сколько зависимых компонентов пакета SDK уже имеется на компьютере, его установка может занять определенное время (от нескольких минут до получаса или более).Depending on the number of the SDK dependencies already on your machine, installing the SDK could take a long time, from several minutes to a half hour or more.

Загрузка и запуск готового решенияDownload and run the completed solution

  1. Загрузите и распакуйте готовое решение.Download and unzip the completed solution.
  2. Запустите Visual Studio.Start Visual Studio.
  3. В меню Файл выберите Открыть проект, перейдите к папке, куда вы скачали решение, а затем откройте файл решения.From the File menu choose Open Project, navigate to where you downloaded the solution, and then open the solution file.
  4. Чтобы построить решение, нажмите CTRL+SHIFT+B.Press CTRL+SHIFT+B to build the solution.

    По умолчанию Visual Studio автоматически восстанавливает содержимое пакета NuGet, которое не включено в ZIP-файл.By default, Visual Studio automatically restores the NuGet package content, which was not included in the .zip file. Если пакеты не восстановлены, установите их вручную, перейдя к диалоговому окну Управление пакетами NuGet для решения и нажав кнопку Восстановить вверху справа.If the packages don't restore, install them manually by going to the Manage NuGet Packages for Solution dialog box and clicking the Restore button at the top right.

  5. В обозревателе решений в качестве запускаемого проекта должен быть выбран ContosoAdsCloudService.In Solution Explorer, make sure that ContosoAdsCloudService is selected as the startup project.
  6. Если вы используете Visual Studio 2015 или более поздней версии, измените строку подключения SQL Server в файле приложения Web.config в проекте ContosoAdsWeb и в файле ServiceConfiguration.Local.cscfg проекта ContosoAdsCloudService.If you're using Visual Studio 2015 or higher, change the SQL Server connection string in the application Web.config file of the ContosoAdsWeb project and in the ServiceConfiguration.Local.cscfg file of the ContosoAdsCloudService project. В каждом файле измените (localdb)\v11.0 на (localdb)\MSSQLLocalDB.In each case, change "(localdb)\v11.0" to "(localdb)\MSSQLLocalDB".
  7. Для запуска приложения нажмите сочетание клавиш CTRL+F5.Press CTRL+F5 to run the application.

    Когда запускаете локально проект облачной службы, Visual Studio автоматически вызывает эмулятор вычислений Azure и эмулятор хранилища Azure.When you run a cloud service project locally, Visual Studio automatically invokes the Azure compute emulator and Azure storage emulator. Эмулятор хранилища использует ресурсы компьютера для эмуляции сред рабочей и веб-ролей.The compute emulator uses your computer's resources to simulate the web role and worker role environments. Эмулятор хранилища использует базу данных SQL Server Express LocalDB для эмуляции работы хранилища Azure в облаке.The storage emulator uses a SQL Server Express LocalDB database to simulate Azure cloud storage.

    При первом запуске проекта облачной службы, запуск эмулятора займет порядка одной минуты.The first time you run a cloud service project, it takes a minute or so for the emulators to start up. После завершения работы эмулятора стандартный браузер открывается с домашней страницей приложения.When emulator startup is finished, the default browser opens to the application home page.

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

  8. Нажмите кнопку Create an Ad (Создать приложение AD).Click Create an Ad.
  9. Введите тестовые данные, выберите файл изображения с расширением .jpg , предназначенный для загрузки, и нажмите Создать.Enter some test data and select a .jpg image to upload, and then click Create.

    Страница создания

    Приложение переходит к странице индексации, но не показывает эскиз для новой рекламы, поскольку индексирование еще не проводилось.The app goes to the Index page, but it doesn't show a thumbnail for the new ad because that processing hasn't happened yet.

  10. Подождите немного и затем обновите страницу индексации, чтобы увидеть эскиз.Wait a moment and then refresh the Index page to see the thumbnail.

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

  11. Щелкните Details , чтобы увидеть рекламу в полный размер.Click Details for your ad to see the full-size image.

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

Приложение запущено полностью локально, без соединения с облаком.You've been running the application entirely on your local computer, with no connection to the cloud. Эмулятор хранилища сохраняет очередь и данные большого двоичного объекта в базе данных SQL Server Express LocalDB, и приложение хранит данные рекламы в другой базе данных LocalDB.The storage emulator stores the queue and blob data in a SQL Server Express LocalDB database, and the application stores the ad data in another LocalDB database. Entity Framework Code First автоматически создает базу данных рекламы в первый раз при обращении приложения к ней.Entity Framework Code First automatically created the ad database the first time the web app tried to access it.

В следующем разделе будет настроено решение для использования ресурсов облака Azure для очередей, больших двоичных объектов и базы данных приложения, когда оно работает в облаке.In the following section you'll configure the solution to use Azure cloud resources for queues, blobs, and the application database when it runs in the cloud. При желании можно запускать приложение локально и далее, но можно делать это, используя облачные ресурсы хранилища и базы данных.If you wanted to continue to run locally but use cloud storage and database resources, you could do that. Все зависит только от задания строк подключения, что показано далее.It's just a matter of setting connection strings, which you'll see how to do.

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

Чтобы запустить приложение в облаке, выполните следующие действия:You'll do the following steps to run the application in the cloud:

  • Создайте облачную службу Azure.Create an Azure cloud service.
  • Создайте базу данных SQL Azure.Create an Azure SQL database.
  • Создайте учетную запись хранения Azure.Create an Azure storage account.
  • Настройте приложение для использования базы данных SQL Azure, когда оно работает в облаке Azure.Configure the solution to use your Azure SQL database when it runs in Azure.
  • Настройте приложение на использование вашей учетной записи хранения при запуске в Azure.Configure the solution to use your Azure storage account when it runs in Azure.
  • Разверните проект в облачной службе Azure.Deploy the project to your Azure cloud service.

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

Облачная служба Azure — это среда, в которой запускают приложение.An Azure cloud service is the environment the application will run in.

  1. В браузере откройте портал Azure.In your browser, open the Azure portal.
  2. Щелкните Создать > Вычисления > Облачная служба.Click New > Compute > Cloud Service.

  3. В поле ввода DNS-имени введите префикс URL-адреса для облачной службы.In the DNS name input box, enter a URL prefix for the cloud service.

    Этот URL-адрес должен быть уникальным.This URL has to be unique. Если выбранный префикс уже используется, появится сообщение об ошибке.You'll get an error message if the prefix you choose is already in use.

  4. Укажите новую группу ресурсов для службы.Specify a new Resource group for the service. Щелкните Создать, а затем введите имя группы ресурсов в поле ввода, например CS_contososadsRG.Click Create new and then type a name in the Resource group input box, such as CS_contososadsRG.

  5. Задайте регион, в котором требуется развернуть приложение.Choose the region where you want to deploy the application.

    В этом поле указывается в каком центре обработки данных будет размещаться облачная служба.This field specifies which datacenter your cloud service will be hosted in. В рабочем приложении следует выбрать регион, ближайший к заказчикам.For a production application, you'd choose the region closest to your customers. Выберите здесь ближайший к вам регион.For this tutorial, choose the region closest to you.

  6. Щелкните Создать.Click Create.

    На следующем рисунке показано, как создается облачная служба с использованием URL-адреса CSvccontosoads.cloudapp.net.In the following image, a cloud service is created with the URL CSvccontosoads.cloudapp.net.

    Новая облачная служба

Создание базы данных SQL AzureCreate an Azure SQL database

Когда приложение запускается в облаке, оно использует расположенную в облаке базу данных.When the app runs in the cloud, it will use a cloud-based database.

  1. На портале Azure щелкните Создать > Базы данных > База данных SQL.In the Azure portal, click New > Databases > SQL Database.
  2. В поле Имя базы данных введите contosoads.In the Database Name box, enter contosoads.
  3. В разделе Группа ресурсов щелкните Использовать существующий и выберите группу ресурсов, используемую для облачной службы.In the Resource group, click Use existing and select the resource group used for the cloud service.
  4. Щелкните Сервер —Настроить обязательные параметры и Создать сервер, как показано на следующем рисунке.In the following image, click Server - Configure required settings and Create a new server.

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

    Если в подписке уже есть сервер, можно выбрать его в раскрывающемся списке.Alternatively, if your subscription already has a server, you can select that server from the drop-down list.

  5. В поле Имя сервера введите csvccontosodbserver.In the Server name box, enter csvccontosodbserver.

  6. Введите имя для входа в систему и пароль администратора.Enter an administrator Login Name and Password.

    Если вы выбрали Создать сервер, не используйте имеющиеся имя и пароль.If you selected Create a new server, you aren't entering an existing name and password here. Введите новые имя и пароль, которые в дальнейшем будут использоваться при обращении к базе данных.You're entering a new name and password that you're defining now to use later when you access the database. Если выбран созданный ранее сервер, появится запрос на ввод пароля для ранее созданной административной учетной записи.If you selected a server that you created previously, you'll be prompted for the password to the administrative user account you already created.

  7. Выберите то же расположение, что и для облачной службы.Choose the same Location that you chose for the cloud service.

    Когда облачная служба и база данных находятся в разных центрах обработки данных (различных регионах), увеличивается задержка и вам потребуется оплачивать пропускную способность за пределами центра обработки данных.When the cloud service and database are in different datacenters (different regions), latency will increase and you will be charged for bandwidth outside the data center. Пропускная способность в рамках центра обработки данных предоставляется бесплатно.Bandwidth within a data center is free.

  8. Проверьте Разрешить службам Azure доступ к серверу.Check Allow azure services to access server.
  9. Нажмите кнопку Выбрать для нового сервера.Click Select for the new server.

    Новый сервер базы данных SQL

  10. Щелкните Создать.Click Create.

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

Учетная запись хранилища Azure обеспечивает ресурсы для хранения данных очередей и больших двоичных объектов в облаке.An Azure storage account provides resources for storing queue and blob data in the cloud.

В реальном приложении обычно создают отдельные учетные записи для данных приложения и данных журналов, а также отдельные учетные записи для тестовых данных и рабочих данных.In a real-world application, you would typically create separate accounts for application data versus logging data, and separate accounts for test data versus production data. В этом руководстве будет использоваться одна учетная запись.For this tutorial, you'll use just one account.

  1. На портале Azure щелкните Создать > Хранилище > Учетная запись хранения — большой двоичный объект, файл, таблица, очередь.In the Azure portal, click New > Storage > Storage account - blob, file, table, queue.
  2. В поле ввода Имя введите префикс URL-адреса.In the Name box, enter a URL prefix.

    Этот префикс в сочетании с текстом, который отображается под полем, будет уникальным URL-адресом для вашей учетной записи хранения.This prefix plus the text you see under the box will be the unique URL to your storage account. Если введенный префикс уже использован где-либо, придется выбрать другой.If the prefix you enter has already been used by someone else, you'll have to choose a different prefix.

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

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

    При включении георепликации для учетной записи хранения хранящиеся данные реплицируются в дополнительный центр обработки данных для обеспечения возможности отработки отказа в случае крупной аварии в основном расположении.When geo-replication is enabled for a storage account, the stored content is replicated to a secondary datacenter to enable failover if a major disaster occurs in the primary location. Георепликация может потребовать дополнительных затрат.Geo-replication can incur additional costs. Для учетных записей тестирования и разработки оплачивать георепликацию обычно не требуется.For test and development accounts, you generally don't want to pay for geo-replication. Дополнительные сведения см. в статье Об учетных записях хранения Azure.For more information, see Create, manage, or delete a storage account.

  5. В разделе Группа ресурсов щелкните Использовать существующий и выберите группу ресурсов, используемую для облачной службы.In the Resource group, click Use existing and select the resource group used for the cloud service.

  6. В раскрывающемся списке Расположение выберите тот же регион, который выбрали для облачной службы.Set the Location drop-down list to the same region you chose for the cloud service.

    Когда облачная служба и учетная запись хранения находятся в разных центрах обработки данных (различных областях), увеличивается задержка и вам потребуется оплачивать пропускную способность за пределами центра обработки данных.When the cloud service and storage account are in different datacenters (different regions), latency will increase and you will be charged for bandwidth outside the data center. Пропускная способность в рамках центра обработки данных предоставляется бесплатно.Bandwidth within a data center is free.

    Территориальные группы Azure обеспечивают механизм для минимизации расстояния между ресурсами в центре обработки данных, что позволяет уменьшить задержку.Azure affinity groups provide a mechanism to minimize the distance between resources in a data center, which can reduce latency. В этом учебнике территориальные группы не используются.This tutorial does not use affinity groups. Дополнительные сведения см. в разделе о создании территориальной группы в Azure.For more information, see How to Create an Affinity Group in Azure.

  7. Щелкните Создать.Click Create.

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

    На следующем рисунке показано создание учетной записи хранилища с URL-адресом csvccontosoads.core.windows.net.In the image, a storage account is created with the URL csvccontosoads.core.windows.net.

Настройка приложения для использования базы данных SQL Azure, когда оно работает в облаке AzureConfigure the solution to use your Azure SQL database when it runs in Azure

Веб-проект и проект рабочей роли имеют свои строки подключения к базе данных, и обе они должны указывать на базу данных SQL Azure, когда приложение работает в Azure.The web project and the worker role project each has its own database connection string, and each needs to point to the Azure SQL database when the app runs in Azure.

Мы используем преобразование Web.config для веб-роли и настройку среды облачной службы для рабочей роли.You'll use a Web.config transform for the web role and a cloud service environment setting for the worker role.

Примечание

В этом и следующем разделах учетные данные будут сохранены в файлах проектов.In this section and the next section, you store credentials in project files. Не сохраняйте важные данные в общедоступном репозитории исходного кода.Don't store sensitive data in public source code repositories.

  1. В проекте ContosoAdsWeb откройте файл преобразования Web.Release.config для файла приложения Web.config, удалите блок комментариев, содержащий элемент <connectionStrings>, и вставьте вместо него следующий код.In the ContosoAdsWeb project, open the Web.Release.config transform file for the application Web.config file, delete the comment block that contains a <connectionStrings> element, and paste the following code in its place.

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

    Оставьте файл открытым для редактирования.Leave the file open for editing.

  2. На портале Azure в области слева щелкните Базы данных SQL, выберите базу данных, созданную для этого руководства, а затем щелкните Показать строки подключения.In the Azure portal, click SQL Databases in the left pane, click the database you created for this tutorial, and then click Show connection strings.

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

    Портал выведет строки подключения со звездочками вместо пароля.The portal displays connection strings, with a placeholder for the password.

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

  3. В файле преобразования Web.Release.config удалите {connectionstring} и вставьте на это место строку подключения ADO.NET с портала Azure.In the Web.Release.config transform file, delete {connectionstring} and paste in its place the ADO.NET connection string from the Azure portal.
  4. В строке подключения, вставленной в файл преобразования Web.Release.config, замените {your_password_here} паролем, созданным для новой базы данных SQL.In the connection string that you pasted into the Web.Release.config transform file, replace {your_password_here} with the password you created for the new SQL database.
  5. Сохраните файл.Save the file.
  6. Выберите и скопируйте строку подключения (без знаков кавычек) для использования на следующих шагах настройки проекта с рабочей ролью.Select and copy the connection string (without the surrounding quotation marks) for use in the following steps for configuring the worker role project.
  7. В обозревателе решений в разделе Роли в проекте облачной службы щелкните правой кнопкой мыши пункт ContosoAdsWorker и выберите Свойства.In Solution Explorer, under Roles in the cloud service project, right-click ContosoAdsWorker and then click Properties.

    Свойства роли

  8. Перейдите на вкладку Параметры .Click the Settings tab.
  9. В раскрывающемся списке Конфигурация службы выберите значение Облако.Change Service Configuration to Cloud.
  10. Выберите поле Значение для параметра ContosoAdsDbConnectionString и вставьте строку подключения, которую скопировали в предыдущем разделе руководства.Select the Value field for the ContosoAdsDbConnectionString setting, and then paste the connection string that you copied from the previous section of the tutorial.

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

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

Настройка приложения для использования вашей учетной записи хранения при запуске в AzureConfigure the solution to use your Azure storage account when it runs in Azure

Строки подключения учетной записи хранения Azure для проектов рабочей роли и веб-роли сохраняются в настройках среды в проекте облачной службы.Azure storage account connection strings for both the web role project and the worker role project are stored in environment settings in the cloud service project. Для каждого проекта используется отдельный набор настроек, если приложение запущено локально или в облаке.For each project, there is a separate set of settings to be used when the application runs locally and when it runs in the cloud. Следует обновить настройки облачной среды для проектов рабочей роли и веб-роли.You'll update the cloud environment settings for both web and worker role projects.

  1. В обозревателе решений щелкните правой кнопкой мыши пункт ContosoAdsWeb в области Роли проекта ContosoAdsCloudService, а затем выберите Свойства.In Solution Explorer, right-click ContosoAdsWeb under Roles in the ContosoAdsCloudService project, and then click Properties.

    Свойства роли

  2. Перейдите на вкладку Параметры . В раскрывающемся списке Конфигурация службы выберите значение Облако.Click the Settings tab. In the Service Configuration drop-down box, choose Cloud.

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

  3. Выберите запись StorageConnectionString, и вы увидите кнопку с многоточием (...) в правом конце строки.Select the StorageConnectionString entry, and you'll see an ellipsis (...) button at the right end of the line. Нажмите эту кнопку с многоточием, чтобы открыть диалоговое окно Создание строки подключения учетной записи хранения .Click the ellipsis button to open the Create Storage Account Connection String dialog box.

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

  4. В диалоговом окне Создание строки подключения к хранилищу установите переключатель Ваша подписка, выберите учетную запись хранения, созданную ранее, и нажмите кнопку ОК.In the Create Storage Connection String dialog box, click Your subscription, choose the storage account that you created earlier, and then click OK. Если вы еще не вошли, появится запрос на ввод учетных данных учетной записи Azure.If you're not already logged in, you'll be prompted for your Azure account credentials.

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

  5. Сохраните изменения.Save your changes.
  6. Следуйте той же процедуре, которую использовали для строки подключения StorageConnectionString, чтобы задать строку подключения Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString.Follow the same procedure that you used for the StorageConnectionString connection string to set the Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString connection string.

    Эта строка подключения используется для журнала.This connection string is used for logging.

  7. Выполните ту же процедуру, которую использовали для роли ContosoAdsWeb, чтобы задать строки подключения для роли ContosoAdsWorker.Follow the same procedure that you used for the ContosoAdsWeb role to set both connection strings for the ContosoAdsWorker role. В раскрывающемся списке Конфигурация службы выберите значение Облако.Don't forget to set Service Configuration to Cloud.

Настройки среды роли, которые были заданы с использованием интерфейса Visual Studio, сохраняются в следующих файлах в проекте ContosoAdsCloudService:The role environment settings that you have configured using the Visual Studio UI are stored in the following files in the ContosoAdsCloudService project:

  • ServiceDefinition.csdef - определяет имена настроек.ServiceDefinition.csdef - Defines the setting names.
  • ServiceConfiguration.Cloud.cscfg - предоставляет значения для приложения при запуске в облаке.ServiceConfiguration.Cloud.cscfg - Provides values for when the app runs in the cloud.
  • ServiceConfiguration.Cloud.cscfg - предоставляет значения для приложения при локальном запуске.ServiceConfiguration.Local.cscfg - Provides values for when the app runs locally.

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

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

Файл ServiceConfiguration.Cloud.cscfg включает значения, которые были введены для этих настроек в Visual Studio:And the ServiceConfiguration.Cloud.cscfg file includes the values you entered for those settings in 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 будет запускать код рабочий роли.The <Instances> setting specifies the number of virtual machines that Azure will run the worker role code on. В раздел Дальнейшие действия включены ссылки на дополнительную информацию о горизонтальном масштабировании облачной службы.The Next steps section includes links to more information about scaling out a cloud service,

Развертывание проекта в AzureDeploy the project to Azure

  1. В обозревателе решений щелкните правой кнопкой мыши проект ContosoAdsCloudService и выберите пункт Опубликовать.In Solution Explorer, right-click the ContosoAdsCloudService cloud project and then select Publish.

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

  2. На шаге Вход мастера публикации приложений Azure нажмите кнопку Далее.In the Sign in step of the Publish Azure Application wizard, click Next.

    Этап входа

  3. На этапе Настройки мастера нажмите кнопку Далее.In the Settings step of the wizard, click Next.

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

    Заданные на вкладке Дополнительно значения по умолчанию подходят для работы с этим руководством.The default settings in the Advanced tab are fine for this tutorial. Дополнительные сведения о вкладке "Дополнительно" см. в разделе о мастере публикации приложения Azure.For information about the advanced tab, see Publish Azure Application Wizard.

  4. На этапе Сводка щелкните Опубликовать.In the Summary step, click Publish.

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

    В Visual Studio открывается окно Журнал действий Azure .The Azure Activity Log window opens in Visual Studio.

  5. Нажмите значок со стрелкой вправо, чтобы развернуть сведения о развертывании.Click the right arrow icon to expand the deployment details.

    Развертывание может занять около 5 минут и более.The deployment can take up to 5 minutes or more to complete.

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

  6. После завершения развертывания щелкните URL-адрес веб-приложения для запуска приложения.When the deployment status is complete, click the Web app URL to start the application.
  7. Теперь можно протестировать приложение, создавая, просматривая и редактируя некоторые элементы рекламы так же, как это происходило при локальном запуске приложения.You can now test the app by creating, viewing, and editing some ads, as you did when you ran the application locally.

Примечание

После завершения тестирования удалите или остановите облачную службу.When you're finished testing, delete or stop the cloud service. Даже если облачная служба не используется, плата за нее начисляется, поскольку ресурсы виртуальной машины для нее зарезервированы.Even if you're not using the cloud service, it's accruing charges because virtual machine resources are reserved for it. Если оставить ее работающей, любой кто найдет этот URL-адрес, сможет создать и просмотреть рекламу.And if you leave it running, anyone who finds your URL can create and view ads. На портале Azure перейдите на вкладку Обзор для облачной службы, а затем в верхней части страницы щелкните Удалить.In the Azure portal, go to the Overview tab for your cloud service, and then click the Delete button at the top of the page. Если необходимо временно предотвратить доступ посторонних к сайту, вместо этого щелкните Остановить .If you just want to temporarily prevent others from accessing the site, click Stop instead. В этом случае плата будет взиматься.In that case, charges will continue to accrue. Можно повторить эту же процедуру для удаления базы данных SQL и учетной записи хранилища, если они больше не нужны.You can follow a similar procedure to delete the SQL database and storage account when you no longer need them.

Создание приложения с нуляCreate the application from scratch

Если завершенное приложениееще не загружено, сделайте это сейчас.If you haven't already downloaded the completed application, do that now. Скопируйте файлы из загруженного проекта в новый проект.You'll copy files from the downloaded project into the new project.

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

  • Создайте новое решение облачной службы в Visual Studio.Create a cloud service Visual Studio solution.
  • Обновите и добавьте пакеты NuGet.Update and add NuGet packages.
  • Указание ссылок на проекты.Set project references.
  • Настройте строки подключения.Configure connection strings.
  • Добавьте файлы кода.Add code files.

После создания решения просмотрите код, уникальный для проектов облачных служб, больших двоичных объектов и очередей Azure.After the solution is created, you'll review the code that is unique to cloud service projects and Azure blobs and queues.

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

  1. В Visual Studio выберите Новый проект from the Файл .In Visual Studio, choose New Project from the File menu.
  2. В диалоговом окне Создание проекта в области слева разверните раздел Visual C#, выберите шаблоны Облако и шаблон Облачная служба Azure.In the left pane of the New Project dialog box, expand Visual C# and choose Cloud templates, and then choose the Azure Cloud Service template.
  3. Присвойте проекту имя ContosoAdsCloudService и нажмите кнопку ОК.Name the project and solution ContosoAdsCloudService, and then click OK.

    Новый проект

  4. В диалоговом окне Новая облачная служба Azure добавьте веб-роль и рабочую роль.In the New Azure Cloud Service dialog box, add a web role and a worker role. Присвойте веб-роли имя ContosoAdsWeb, а рабочей роли — ContosoAdsWorker.Name the web role ContosoAdsWeb, and name the worker role ContosoAdsWorker. (Используйте значок карандаша на правой панели для изменения имен ролей по умолчанию.)(Use the pencil icon in the right-hand pane to change the default names of the roles.)

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

  5. Когда появится диалоговое окно Новый проект ASP.NET для веб-роли, выберите шаблон MVC и щелкните Изменить проверку подлинности.When you see the New ASP.NET Project dialog box for the web role, choose the MVC template, and then click Change Authentication.

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

  6. В диалоговом окне Изменение проверки подлинности щелкните Без проверки подлинности и нажмите кнопку ОК.In the Change Authentication dialog box, choose No Authentication, and then click OK.

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

  7. В диалоговом окне Новый проект ASP.NET нажмите кнопку ОК.In the New ASP.NET Project dialog, click OK.
  8. В обозревателе решений щелкните правой кнопкой мыши решение (не проект) и выберите Добавить новый проект.In Solution Explorer, right-click the solution (not one of the projects), and choose Add - New Project.
  9. В диалоговом окне Добавить новый проект выберите Windows в разделе Visual C# на панели слева, а затем щелкните шаблон Библиотека классов.In the Add New Project dialog box, choose Windows under Visual C# in the left pane, and then click the Class Library template.
  10. Присвойте проекту имя ContosoAdsCommonи нажмите кнопку ОК.Name the project ContosoAdsCommon, and then click OK.

    Необходимо сослаться на контекст и модель данных Entity Framework в обоих проектах — веб-роли и рабочей роли.You need to reference the Entity Framework context and the data model from both web and worker role projects. Как вариант, можно определить связанные с EF классы в проекте веб-роли и сослаться на этот проект из проекта рабочей роли.As an alternative, you could define the EF-related classes in the web role project and reference that project from the worker role project. Но в случае альтернативного метода в проекте рабочей роли будет ссылка на веб-сборки, которые ему не нужны.But in the alternative approach, your worker role project would have a reference to web assemblies that it doesn't need.

Обновите и добавьте пакеты NuGetUpdate and add NuGet packages

  1. Откройте диалоговое окно Управление пакетами NuGet для решения.Open the Manage NuGet Packages dialog box for the solution.
  2. В верхней части окна выберите пункт Обновления.At the top of the window, select Updates.
  3. Найдите пакет WindowsAzure.Storage и, если он есть в списке, выберите его и выберите веб-проект и проект рабочей роли для обновления пакета в этих проектах, а затем нажмите кнопку Обновить.Look for the WindowsAzure.Storage package, and if it's in the list, select it and select the web and worker projects to update it in, and then click Update.

    Клиентская библиотека хранилища обновляется чаще, чем шаблоны проектов Visual Studio, поэтому часто происходит так, что версию во вновь создаваемых проектах необходимо обновить.The storage client library is updated more frequently than Visual Studio project templates, so you'll often find that the version in a newly-created project needs to be updated.

  4. В верхней части окна выберите пункт Обзор.At the top of the window, select Browse.
  5. Найдите пакет NuGet EntityFramework и установите его во все проекты.Find the EntityFramework NuGet package, and install it in all three projects.
  6. Найдите пакет NuGet Microsoft.WindowsAzure.ConfigurationManager и установите его в проект рабочей роли.Find the Microsoft.WindowsAzure.ConfigurationManager NuGet package, and install it in the worker role project.

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

  1. Задайте в проекте ContosoAdsWeb ссылку на проект ContosoAdsCommon.In the ContosoAdsWeb project, set a reference to the ContosoAdsCommon project. Щелкните правой кнопкой мыши проект ContosoAdsWeb и выберите пункты Ссылки - Добавление ссылок.Right-click the ContosoAdsWeb project, and then click References - Add References. В диалоговом окне Диспетчер ссылок выберите пункты Решение — Проекты на панели слева, щелкните ContosoAdsCommon, а затем нажмите кнопку ОК.In the Reference Manager dialog box, select Solution – Projects in the left pane, select ContosoAdsCommon, and then click OK.
  2. Задайте в проекте ContosoAdsWorker ссылку на проект ContosoAdsCommon.In the ContosoAdsWorker project, set a reference to the ContosAdsCommon project.

    ContosoAdsCommon будет содержать модель данных и контекстный класс Entity Framework, который будет использован как фоновой, так и интерфейсной службой.ContosoAdsCommon will contain the Entity Framework data model and context class, which will be used by both the front-end and back-end.

  3. Задайте в проекте ContosoAdsWorker ссылку на System.Drawing.In the ContosoAdsWorker project, set a reference to System.Drawing.

    Сборка используется внутренней службой для преобразования изображений в эскизы.This assembly is used by the back-end to convert images to thumbnails.

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

В этом разделе настройте хранилище Azure и строки подключения SQL для локального тестирования.In this section, you configure Azure Storage and SQL connection strings for testing locally. Инструкции по развертыванию ранее в этом руководстве объясняют, как установить строки подключения в случае, когда приложение работает в облаке.The deployment instructions earlier in the tutorial explain how to set up the connection strings for when the app runs in the cloud.

  1. В проекте ContosoAdsWeb откройте файл приложения Web.config и вставьте следующий элемент connectionStrings после элемента configSections:In the ContosoAdsWeb project, open the application Web.config file, and insert the following connectionStrings element after the configSections element.

    <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.If you're using Visual Studio 2015 or higher, replace "v11.0" with "MSSQLLocalDB".

  2. Сохраните изменения.Save your changes.
  3. В проекте ContosoAdsCloudService щелкните правой кнопкой мыши ContosoAdsWeb в разделе Роли, а затем выберите Свойства.In the ContosoAdsCloudService project, right-click ContosoAdsWeb under Roles, and then click Properties.

    Свойства роли

  4. В окне свойств ContosAdsWeb [роль] щелкните вкладку Настройки и затем щелкните Добавить настройку.In the ContosAdsWeb [Role] properties window, click the Settings tab, and then click Add Setting.

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

  5. Добавьте настройку с именем StorageConnectionString.Add a setting named StorageConnectionString. Задайте для параметра Тип значение ConnectionString, а для параметра ЗначениеUseDevelopmentStorage=true.Set Type to ConnectionString, and set Value to UseDevelopmentStorage=true.

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

  6. Сохраните изменения.Save your changes.
  7. Следуйте этой же процедуре для добавления строки подключения хранилища в свойства роли ContosoAdsWorker.Follow the same procedure to add a storage connection string in the ContosoAdsWorker role properties.
  8. Там же в окне свойств ContosoAdsWorker [роль] добавьте другую строку подключения:Still in the ContosoAdsWorker [Role] properties window, add another connection string:

    • Имя: ContosoAdsDbConnectionStringName: ContosoAdsDbConnectionString
    • Тип: строкаType: String
    • Значение. Вставьте ту же строку подключения, которая была использована для проекта веб-роли.Value: Paste the same connection string you used for the web role project. (Этот пример предназначен для Visual Studio 2013.(The following example is for Visual Studio 2013. Не забудьте изменить источник данных при копировании этого примера для Visual Studio 2015 или более поздней версии.)Don't forget to change the Data Source if you copy this example and you're using Visual Studio 2015 or higher.)

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

Добавьте файлы кодаAdd code files

В этом разделе скопируйте файлы кода из скачанного решения в новое решение.In this section, you copy code files from the downloaded solution into the new solution. Следующие разделы покажут и объяснят важные части этого кода.The following sections will show and explain key parts of this code.

Чтобы добавить файлы в проект или папку, щелкните правой кнопкой мыши проект или папку и щелкните Добавить - Существующий элемент.To add files to a project or a folder, right-click the project or folder and click Add - Existing Item. Выберите необходимые файлы и щелкните Добавить.Select the files you want and then click Add. При запросе о том, заменять ли существующие файлы, щелкните Да.If asked whether you want to replace existing files, click Yes.

  1. В проекте ContosoAdsCommon удалите файл Class1.cs и добавьте на его место файлы Ad.cs и ContosoAdscontext.cs из скачанного проекта.In the ContosoAdsCommon project, delete the Class1.cs file and add in its place the Ad.cs and ContosoAdscontext.cs files from the downloaded project.
  2. В проекте ContosoAdsCommon добавьте следующие файлы из загруженного проекта.In the ContosoAdsWeb project, add the following files from the downloaded project.

    • Global.asax.cs.Global.asax.cs.
    • В папку Views\Shared: файл _Layout.cshtml.In the Views\Shared folder: _Layout.cshtml.
    • В папку Views\Home: файл Index.cshtml.In the Views\Home folder: Index.cshtml.
    • В папку Controllers: файл AdController.cs.In the Controllers folder: AdController.cs.
    • В папку Views\Ad (сначала создайте эту папку): пять файлов CSHTML.In the Views\Ad folder (create the folder first): five .cshtml files.
  3. В проекте ContosoAdsCommon добавьте WorkerRole.cs из загруженного проекта.In the ContosoAdsWorker project, add WorkerRole.cs from the downloaded project.

Теперь можно создать и запустить приложение, как описывали инструкции ранее в этом руководстве, и приложение будет использовать локальные ресурсы эмуляторов базы данных и хранилища.You can now build and run the application as instructed earlier in the tutorial, and the app will use local database and storage emulator resources.

В следующих разделах объясняется код, связанный с работой среды Azure, больших двоичных объектов и очередей.The following sections explain the code related to working with the Azure environment, blobs, and queues. В этом учебнике не представлены следующие пошаговые инструкции: "Создание контроллеров и представлений MVC с помощью формирования шаблонов", "Запись кода Entity Framework, который работает с базами данных SQL Server" или "Основы асинхронного программирования в ASP.NET 4.5".This tutorial does not explain how to create MVC controllers and views using scaffolding, how to write Entity Framework code that works with SQL Server databases, or the basics of asynchronous programming in ASP.NET 4.5. Дополнительные сведения см. в следующих статьях:For information about these topics, see the following resources:

ContosoAdsCommon - Ad.csContosoAdsCommon - Ad.cs

Файл Ad.cs определяет перечисляемый тип для класса Ad и класс сущностей POCO для информации в рекламе.The Ad.cs file defines an enum for ad categories and a POCO entity class for ad information.

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.csContosoAdsCommon - ContosoAdsContext.cs

Класс ContosoAdsContext указывает, что класс Ad используется коллекцией DbSet, которую Entity Framework хранит в базе данных SQL.The ContosoAdsContext class specifies that the Ad class is used in a DbSet collection, which Entity Framework will store in a SQL database.

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

Класс имеет два конструктора.The class has two constructors. Первый из них используется веб-проектом и указывает имя строки подключения, которая сохранена в файле Web.configThe first of them is used by the web project, and specifies the name of a connection string that is stored in the Web.config file. Второй конструктор дает возможность передачи действующей строки подключения, которая используется проектом рабочей роли, так как она не имеет файла Web.config.The second constructor enables you to pass in the actual connection string used by the worker role project, since it doesn't have a Web.config file. Ранее было показано, где хранится строка подключения, а потом будет показано, как код извлекает строку подключения, когда он создает экземпляр класса DbContext.You saw earlier where this connection string was stored, and you'll see later how the code retrieves the connection string when it instantiates the DbContext class.

ContosoAdsWeb - Global.asax.csContosoAdsWeb - Global.asax.cs

Код, который вызывается из метода Application_Start, создает контейнер больших двоичных объектов images и очередь images, если они отсутствуют.Code that is called from the Application_Start method creates an images blob container and an images queue if they don't already exist. Это гарантирует, что при начале использования новой учетной записи хранения или эмулятора хранилища на новом компьютере требуемый контейнер больших двоичных объектов и очередь создаются автоматически.This ensures that whenever you start using a new storage account, or start using the storage emulator on a new computer, the required blob container and queue will be created automatically.

Код получает доступ к учетной записи хранилища, используя строку подключения из файла .cscfg .The code gets access to the storage account by using the storage connection string from the .cscfg file.

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

Затем он получает ссылку на контейнер больших двоичных объектов images , создает контейнер, если он еще не существует, и устанавливает разрешения доступа к новому контейнеру.Then it gets a reference to the images blob container, creates the container if it doesn't already exist, and sets access permissions on the new container. По умолчанию новые контейнеры разрешают доступ к большим двоичным объектам только клиентам с данными учетной записи хранения.By default, new containers only allow clients with storage account credentials to access blobs. Веб-сайту требуются общедоступные большие двоичные объекты, чтобы он мог выводить изображения с использованием URL-адресов, которые указывают на объекты изображений.The website needs the blobs to be public so that it can display images using URLs that point to the image blobs.

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

Аналогичный код получает ссылку на очередь images и создает новую очередь.Similar code gets a reference to the images queue and creates a new queue. В этом случае изменения разрешений не требуется.In this case, no permissions change is needed.

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

ContosoAdsWeb — _Layout.cshtmlContosoAdsWeb - _Layout.cshtml

Файл _Layout.cshtml задает имя приложения в заголовке и нижнем колонтитуле и создает запись меню "Ads".The _Layout.cshtml file sets the app name in the header and footer, and creates an "Ads" menu entry.

ContosoAdsWeb - Views\Home\Index.cshtmlContosoAdsWeb - Views\Home\Index.cshtml

Файл Views\Home\Index.cshtml выводит ссылки категорий на домашней странице.The Views\Home\Index.cshtml file displays category links on the home page. Ссылки передают целочисленное значение перечисляемого типа Category в переменную querystring на странице индекса Ads.The links pass the integer value of the Category enum in a querystring variable to the Ads Index page.

<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.csContosoAdsWeb - AdController.cs

В файле AdController.cs конструктор вызывает метод InitializeStorage для создания объектов клиентской библиотеки службы хранилища Azure, которые предоставляют API-интерфейс для работы с большими двоичными объектами и очередями.In the AdController.cs file, the constructor calls the InitializeStorage method to create Azure Storage Client Library objects that provide an API for working with blobs and queues.

Затем код получает ссылку на контейнер больших двоичных объектов images, как показано ранее в Global.asax.cs.Then the code gets a reference to the images blob container as you saw earlier in Global.asax.cs. При этом он устанавливает политику повторения по умолчанию, подходящую для веб-приложения.While doing that it sets a default retry policy appropriate for a web app. Политика повторения с экспоненциальной задержкой по умолчанию может застопорить веб-приложение более чем на минуту при повторяющихся повторах во время кратковременного сбоя.The default exponential backoff retry policy could hang the web app for longer than a minute on repeated retries for a transient fault. Политика повторения здесь указывает ожидание в три секунды после каждой попытки, всего до трех повторений.The retry policy specified here waits three seconds after each try for up to three tries.

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

Аналогичный код получает ссылку на очередь images .Similar code gets a reference to the images queue.

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

Большая часть кода контроллера обычна для работы с моделью данных Entity Framework с использованием класса DbContext.Most of the controller code is typical for working with an Entity Framework data model using a DbContext class. Исключением является метод Create HttpPost, который отправляет файл и сохраняет его в хранилище больших двоичных объектов.An exception is the HttpPost Create method, which uploads a file and saves it in blob storage. Связыватель модели предоставляет объект HttpPostedFileBase для метода.The model binder provides an HttpPostedFileBase object to the method.

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

При выбора файла для отправки код отправляет его, сохраняет его в большом двоичном объекте и обновляет запись базы данных URL-адресом, который указывает на большой двоичный объект.If the user selected a file to upload, the code uploads the file, saves it in a blob, and updates the Ad database record with a URL that points to the blob.

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

Код отправки содержится в методе UploadAndSaveBlobAsync .The code that does the upload is in the UploadAndSaveBlobAsync method. Он создает имя GUID для большого двоичного объекта, отправляет и сохраняет файл, а также возвращает ссылку на сохраненный большой двоичный объект.It creates a GUID name for the blob, uploads and saves the file, and returns a reference to the saved blob.

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 загружает большой двоичный объект и обновляет базу данных, он создает сообщение очереди для информирования фонового процесса о том, что изображение готово для преобразования в эскиз.After the HttpPost Create method uploads a blob and updates the database, it creates a queue message to inform that back-end process that an image is ready for conversion to a thumbnail.

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

Код для метода HttpPost Edit аналогичен, за одним исключением — если пользователь выбирает новый файл изображения, все существующие большие двоичные объекты должны быть удалены.The code for the HttpPost Edit method is similar except that if the user selects a new image file any blobs that already exist must be deleted.

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

Ниже представлен пример кода, который удаляет большие двоичные объекты при удалении элемента рекламы.The next example shows the code that deletes blobs when you delete an ad.

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.cshtmlContosoAdsWeb - Views\Ad\Index.cshtml and Details.cshtml

Файл Index.cshtml выводит эскиз с другими данными рекламы.The Index.cshtml file displays thumbnails with the other ad data.

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

Файл Details.cshtml выводит изображение в полном размере.The Details.cshtml file displays the full-size image.

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

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

Файлы Create.cshtml и Edit.cshtml указывают кодирование формы, которое дает возможность контроллеру получить объект HttpPostedFileBase.The Create.cshtml and Edit.cshtml files specify form encoding that enables the controller to get the HttpPostedFileBase object.

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

Элемент <input> сообщает браузеру, что нужно открыть диалоговое окно выбора файла.An <input> element tells the browser to provide a file selection dialog.

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

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

Среда рабочей роли Azure вызывает метод OnStart в классе WorkerRole, когда рабочая роль начинает работу, и вызывает метод Run, когда метод OnStart завершает работу.The Azure worker role environment calls the OnStart method in the WorkerRole class when the worker role is getting started, and it calls the Run method when the OnStart method finishes.

Метод OnStart получает строку подключения к базе данных из CSCFG-файла и передает ее в класс Entity Framework DbContext.The OnStart method gets the database connection string from the .cscfg file and passes it to the Entity Framework DbContext class. Поставщик SQLClient используется по умолчанию, поэтому поставщик не нужно указывать.The SQLClient provider is used by default, so the provider does not have to be specified.

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

Затем метод получит ссылку на учетную запись хранилища и создаст контейнер больших двоичных объектов и очередь, если они не существуют.After that, the method gets a reference to the storage account and creates the blob container and queue if they don't exist. Этот код аналогичен тому, что показан в методе Application_Start веб-роли.The code for that is similar to what you already saw in the web role Application_Start method.

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

Метод Run вызывается, когда метод OnStart завершает свою начальную работу.The Run method is called when the OnStart method finishes its initialization work. Метод выполняет бесконечный цикл, в котором ждет новые сообщения в очереди и обрабатывает их, когда они прибывают.The method executes an infinite loop that watches for new queue messages and processes them when they arrive.

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);
        }
    }
}

После каждой итерации цикла, если сообщение найдено в очереди, программа останавливается на секунду.After each iteration of the loop, if no queue message was found, the program sleeps for a second. Это защищает рабочую роль от создания ненужных затрат при использовании времени процессора и транзакций в хранилище.This prevents the worker role from incurring excessive CPU time and storage transaction costs. Команда Microsoft Customer Advisory рассказывала о разработчике, который забыл включить этот функционал, развернул код в рабочей среде и ушел в отпуск.The Microsoft Customer Advisory Team tells a story about a developer who forgot to include this, deployed to production, and left for vacation. Когда он вернулся, то выяснил, что забывчивость встала ему в копеечку.When he got back, his oversight cost more than the vacation.

Иногда содержимое сообщения очереди вызывает ошибку при обработке.Sometimes the content of a queue message causes an error in processing. Это ядовитое сообщение — если ошибка только протоколируется и цикл будет перезапущен, то сообщение можно обрабатывать бесконечно.This is called a poison message, and if you just logged an error and restarted the loop, you could endlessly try to process that message. Поэтому блок catch включает правило if, которое проверяет, сколько раз приложение пыталось обработать текущее сообщение. Если уже насчитано 5 раз, сообщение удаляется из очереди.Therefore the catch block includes an if statement that checks to see how many times the app has tried to process the current message, and if it has been more than 5 times, the message is deleted from the queue.

ProcessQueueMessage вызывается, когда сообщение найдено в очереди.ProcessQueueMessage is called when a queue message is found.

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-адрес большого двоичного объекта эскиза и удаляет сообщение из очереди.This code reads the database to get the image URL, converts the image to a thumbnail, saves the thumbnail in a blob, updates the database with the thumbnail blob URL, and deletes the queue message.

Примечание

Для простоты код в методе ConvertImageToThumbnailJPG использует классы в пространстве имен System.Drawing.The code in the ConvertImageToThumbnailJPG method uses classes in the System.Drawing namespace for simplicity. Однако классы в этом пространстве имен были спроектированы для использования с формами Windows.However, the classes in this namespace were designed for use with Windows Forms. Они не поддерживаются в службе Windows или ASP.NET.They are not supported for use in a Windows or ASP.NET service. Дополнительные сведения о параметрах обработки изображений см. в статьях 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 Натанаэлем).For more information about image-processing options, see Dynamic Image Generation and Deep Inside Image Resizing.

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

У вас что-то не работает, когда вы выполняете инструкции из этого руководства? Вот несколько общих ошибок и способы их устранения.In case something doesn't work while you're following the instructions in this tutorial, here are some common errors and how to resolve them.

ServiceRuntime.RoleEnvironmentExceptionServiceRuntime.RoleEnvironmentException

Объект RoleEnvironment предоставляется Azure, когда приложение запущено в Azure или локально с использованием эмулятора вычислений Azure.The RoleEnvironment object is provided by Azure when you run an application in Azure or when you run locally using the Azure compute emulator. Если сообщение об этой ошибке появляется при локальном выполнении, убедитесь, что проект ContosoAdsCloudService установлен как начальный.If you get this error when you're running locally, make sure that you have set the ContosoAdsCloudService project as the startup project. Это настраивает проект для запуска с использованием эмулятора вычислений Azure.This sets up the project to run using the Azure compute emulator.

Одной из причин, по которым приложение использует RoleEnvironment в Azure, — это получение значений строки подключения, которые что они хранятся в файлах .cscfg , поэтому другой причиной этого исключения является отсутствие строки подключения.One of the things the application uses the Azure RoleEnvironment for is to get the connection string values that are stored in the .cscfg files, so another cause of this exception is a missing connection string. Убедитесь, что настройка StorageConnectionString создана для вариантов "Облако" и "Локально" в проекте ContosoAdsWeb, и что созданы обе строки подключения для обоих вариантов в проекте ContosoAdsWorker.Make sure that you created the StorageConnectionString setting for both Cloud and Local configurations in the ContosoAdsWeb project, and that you created both connection strings for both configurations in the ContosoAdsWorker project. Выполните поиск Найти все по StorageConnectionString во всем решении; запись должна появиться 9 раз в 6 файлах.If you do a Find All search for StorageConnectionString in the entire solution, you should see it 9 times in 6 files.

Невозможно переопределить на порт ххх.Cannot override to port xxx. Новый порт ниже минимально разрешенного значения 8080 для протокола httpNew port below minimum allowed value 8080 for protocol http

Попробуйте изменить номер порта, используемый веб-проектом.Try changing the port number used by the web project. Щелкните правой кнопкой мыши проект ContosoAdsWeb и выберите пункт Свойства.Right-click the ContosoAdsWeb project, and then click Properties. Щелкните вкладку Веб и измените номер порта в параметре URL-адрес проекта.Click the Web tab, and then change the port number in the Project Url setting.

Другим вариантом может быть решение в следующем разделе.For another alternative that might resolve the problem, see the following section.

Другие ошибки при работе локальноOther errors when running locally

По умолчанию новые проекты облачной службы используют облегченный эмулятор вычислений Azure для имитации среды Azure.By default new cloud service projects use the Azure compute emulator express to simulate the Azure environment. Это облегченная версия полнофункционального эмулятора вычислений; при некоторых условиях полнофункциональный эмулятор будет работать, а облегченный — нет.This is a lightweight version of the full compute emulator, and under some conditions the full emulator will work when the express version does not.

Для переключения проекта на использование полнофункционального эмулятора щелкните правой кнопкой мыши проект ContosoAdsCloudService и выберите Свойства.To change the project to use the full emulator, right-click the ContosoAdsCloudService project, and then click Properties. В окне Свойства щелкните вкладку Веб, а затем установите переключатель Использовать полный эмулятор.In the Properties window click the Web tab, and then click the Use Full Emulator radio button.

Для запуска приложения с полным эмулятором следует открыть Visual Studio с правами администратора.In order to run the application with the full emulator, you have to open Visual Studio with administrator privileges.

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

Приложение Contoso Ads намеренно сделано простым для руководства по началу работы.The Contoso Ads application has intentionally been kept simple for a getting-started tutorial. Например, оно не реализует вставку зависимостей или репозиторий и блок рабочих шаблонов, не использует интерфейс для журналов, не использует EF Code First Migrations для управления изменениями модели данных или EF Connection Resiliency для управления кратковременными ошибками сети и т. д.For example, it doesn't implement dependency injection or the repository and unit of work patterns, it doesn't use an interface for logging, it doesn't use EF Code First Migrations to manage data model changes or EF Connection Resiliency to manage transient network errors, and so forth.

Есть несколько примеров приложений облачной службы, которые демонстрируют более жизненные примеры кодирования — от менее сложных к более сложным:Here are some cloud service sample applications that demonstrate more real-world coding practices, listed from less complex to more complex:

Общую информацию об облачной разработке см. в статье о создании реальных облачных приложений в Azure.For general information about developing for the cloud, see Building Real-World Cloud Apps with Azure.

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

Для получения дополнительных сведений см. следующие ресурсы:For more information, see the following resources: