Introdução aos Serviços de Nuvem do Azure e ao ASP.NETGet started with Azure Cloud Services and ASP.NET

Visão geralOverview

Este tutorial mostra como criar um aplicativo de várias camadas .NET com front-end ASP.NET MVC e implantá-lo no serviço de nuvem do 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. O aplicativo usa o Banco de Dados SQL do Azure, o serviço Blob do Azure e o serviço Fila do Azure.The application uses Azure SQL Database, the Azure Blob service, and the Azure Queue service. Você pode baixar o projeto do Visual Studio na Galeria de Códigos do MSDN.You can download the Visual Studio project from the MSDN Code Gallery.

O tutorial mostra como criar e executar o aplicativo localmente, como implantá-lo no Azure e executá-lo na nuvem e como criá-lo do zero.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. Você pode começar criando do zero e depois fazer o teste e implantar as etapas posteriormente se preferir.You can start by building from scratch and then do the test and deploy steps afterward if you prefer.

O aplicativo Contoso AdsContoso Ads application

O aplicativo é um painel de anúncios eletrônico.The application is an advertising bulletin board. Os usuários criam um anúncio inserindo texto e carregando uma imagem.Users create an ad by entering text and uploading an image. Eles podem ver uma lista de anúncios com imagens em miniatura e podem ver a imagem em tamanho total ao selecionar um anúncio para ver os detalhes.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.

Lista de anúncios

O aplicativo usa o padrão centrado em fila para descarregar o trabalho intensivo de CPU de criação de miniaturas para um processo de back-end.The application uses the queue-centric work pattern to off-load the CPU-intensive work of creating thumbnails to a back-end process.

Arquitetura alternativa: Serviço de Aplicativo e WebJobsAlternative architecture: App Service and WebJobs

Este tutorial mostra como executar front-end e back-end no serviço de nuvem do Azure.This tutorial shows how to run both front-end and back-end in an Azure cloud service. Uma alternativa é executar o front-end no Serviço de Aplicativo do Azure e usar o recurso WebJobs para o back-end.An alternative is to run the front-end in Azure App Service and use the WebJobs feature for the back-end. Para obter um tutorial que usa WebJobs, consulte Introdução ao SDK WebJobs do Azure.For a tutorial that uses WebJobs, see Get Started with the Azure WebJobs SDK. Para obter informações sobre como escolher os serviços que melhor se ajustam ao seu cenário, confira Comparação entre o Serviço de Aplicativo do Azure, Serviços de Nuvem e máquinas virtuais.For information about how to choose the services that best fit your scenario, see Azure App Service, Cloud Services, and virtual machines comparison.

O que você aprenderáWhat you'll learn

  • Como habilitar seu computador para desenvolvimento do Azure ao instalar o SDK do Azure.How to enable your machine for Azure development by installing the Azure SDK.
  • Como criar um projeto de serviço de nuvem do Visual Studio com uma função de trabalho e uma função Web MVC do ASP.NET.How to create a Visual Studio cloud service project with an ASP.NET MVC web role and a worker role.
  • Como testar o projeto de serviço de nuvem localmente, usando o emulador de armazenamento do Azure.How to test the cloud service project locally, using the Azure storage emulator.
  • Como publicar o projeto de nuvem em um serviço de nuvem do Azure e testar usando uma conta de armazenamento do Azure.How to publish the cloud project to an Azure cloud service and test using an Azure storage account.
  • Como carregar arquivos e armazená-los no serviço Blob do Azure.How to upload files and store them in the Azure Blob service.
  • Como usar o serviço Fila do Azure para comunicação entre camadas.How to use the Azure Queue service for communication between tiers.

Pré-requisitosPrerequisites

O tutorial assume que você conhece os conceitos básicos sobre os serviços de nuvem do Azure como terminologia de função web e de função de trabalho.The tutorial assumes that you understand basic concepts about Azure cloud services such as web role and worker role terminology. Também assumimos que você sabe como trabalhar com projetos ASP.NET MVC ou de Web Forms no Visual Studio.It also assumes that you know how to work with ASP.NET MVC or Web Forms projects in Visual Studio. O aplicativo função Web usa MVC, mas a maior parte do tutorial também aplica-se a Formulários da Web.The sample application uses MVC, but most of the tutorial also applies to Web Forms.

Você também pode executar o aplicativo localmente sem uma assinatura do Azure, mas precisará de uma para implantar o aplicativo na nuvem.You can run the app locally without an Azure subscription, but you'll need one to deploy the application to the cloud. Se não tem uma conta, você pode ativar os benefícios de assinante MSDN ou inscrever-se em uma avaliação gratuita.If you don't have an account, you can activate your MSDN subscriber benefits or sign up for a free trial.

As instruções do tutorial funcionam com qualquer um dos seguintes produtos:The tutorial instructions work with any of the following products:

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

Se você não tiver nenhum desses produtos, o Visual Studio poderá ser instalado automaticamente ao instalar o SDK do Azure.If you don't have one of these, Visual Studio may be installed automatically when you install the Azure SDK.

Arquitetura do aplicativoApplication architecture

O aplicativo armazena anúncios em um banco de dados SQL usando Entity Framework Code First para criar as tabelas e acessar os dados.The app stores ads in a SQL database, using Entity Framework Code First to create the tables and access the data. Para cada anúncio, o banco de dados armazena duas URLs: uma para a imagem em tamanho total e outra para a miniatura.For each ad, the database stores two URLs, one for the full-size image and one for the thumbnail.

Tabela de anúncios

Quando um usuário carrega uma imagem, o front-end sendo executado em uma função Web armazena a imagem em um Blob do Azuree armazena as informações do anúncio no banco de dados com uma URL que aponta para o blob.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. Ao mesmo tempo, ele grava uma mensagem em uma fila do Azure.At the same time, it writes a message to an Azure queue. Um processo de back-end sendo executado periodicamente em um função de trabalho consulta a fila para ver se há novas mensagens.A back-end process running in a worker role periodically polls the queue for new messages. Quando uma mensagem é exibida, a função de trabalho cria uma miniatura para essa imagem e atualiza o campo do banco de dados da URL de miniatura desse anúncio.When a new message appears, the worker role creates a thumbnail for that image and updates the thumbnail URL database field for that ad. O diagrama a seguir mostra como as partes do aplicativo interagem.The following diagram shows how the parts of the application interact.

Arquitetura do Contoso Ads

Configurar o ambiente de desenvolvimentoSet up the development environment

Para começar, configure seu ambiente de desenvolvimento com o Visual Studio e o SDK do Azure.To start, set up your development environment with Visual Studio and the Azure SDK.

  • 2019 do Visual Studio inclui o SDK do Azure.Visual Studio 2019 includes the Azure SDK. Se você estiver usando o Visual Studio de 2019, nenhuma configuração adicional é necessária para o ambiente de desenvolvimento.If you're using Visual Studio 2019, no additional setup is needed for the development environment.

  • Para o Visual Studio 2015, clique no seguinte link para instalar o SDK do Azure para Visual Studio 2015.For Visual Studio 2015, click the following link to install the Azure SDK for Visual Studio 2015.

  • Para o Visual Studio 2013, clique no seguinte link para instalar o SDK do Azure para Visual Studio 2013.For Visual Studio 2013, click the following link to install the Azure SDK for Visual Studio 2013.

  • Se você não tiver instalado o Visual Studio, use o seguinte para instalar Visual Studio de 2019 com o SDK do Azure.If you don't have Visual Studio installed, use the following to install Visual Studio 2019 with the Azure SDK.

Observação

Dependendo de quantas dependências de SDK você já tiver no seu computador, a instalação do SDK pode demorar bastante, de vários minutos a meia hora ou mais.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.

Baixar e executar a solução completaDownload and run the completed solution

  1. Baixar e descompactar a solução concluída.Download and unzip the completed solution.

  2. Inicie o Visual Studio.Start Visual Studio.

  3. No menu Arquivo, escolha Abrir Projeto, navegue até onde você baixou a solução e, em seguida, abra o arquivo de solução.From the File menu choose Open Project, navigate to where you downloaded the solution, and then open the solution file.

  4. Pressione CTRL+SHIFT+B para criar a solução.Press CTRL+SHIFT+B to build the solution.

    Por padrão, o Visual Studio restaura automaticamente o conteúdo do pacote NuGet, que não foi incluído no arquivo .zip .By default, Visual Studio automatically restores the NuGet package content, which was not included in the .zip file. Se os pacotes não forem restaurados, instale-os manualmente acessando a caixa de diálogo Gerenciar Pacotes NuGet para Solução e clicando no botão Restaurar na parte superior direita.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. No Gerenciador de Soluções, certifique-se de que ContosoAdsCloudService foi selecionado como o projeto de inicialização.In Solution Explorer, make sure that ContosoAdsCloudService is selected as the startup project.

  6. Se você estiver usando o Visual Studio 2015 ou superior, altere a cadeia de conexão do SQL Server no arquivo Web.config do aplicativo do projeto ContosoAdsWeb e no arquivo ServiceConfiguration.Local.cscfg do projeto 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. Em cada caso, altere "(localdb)\v11.0" para "(localdb)\MSSQLLocalDB".In each case, change "(localdb)\v11.0" to "(localdb)\MSSQLLocalDB".

  7. Pressione CTRL+F5 para executar o aplicativo.Press CTRL+F5 to run the application.

    Quando você executar um projeto de serviço de nuvem localmente, o Visual Studio invocará automaticamente o emulador de computação e o emulador de armazenamento do Azure.When you run a cloud service project locally, Visual Studio automatically invokes the Azure compute emulator and Azure storage emulator. O emulador de computação usa os recursos do seu computador para simular os ambientes de função Web e de função de trabalho.The compute emulator uses your computer's resources to simulate the web role and worker role environments. O emulador de armazenamento usa um banco de dados LocalDB do SQL Server Express para simular o armazenamento em nuvem do Azure.The storage emulator uses a SQL Server Express LocalDB database to simulate Azure cloud storage.

    Na primeira vez em que você executar um projeto de serviço de nuvem, levará por volta de um minuto para que os emuladores sejam inicializados.The first time you run a cloud service project, it takes a minute or so for the emulators to start up. Quando a inicialização do emulador for finalizada, o navegador padrão abrirá na home page do aplicativo.When emulator startup is finished, the default browser opens to the application home page.

    Arquitetura do Contoso Ads

  8. Clique em Criar um Anúncio.Click Create an Ad.

  9. Insira alguns dados de teste e selecione uma imagem em .jpg para carregar e depois clique em Criar.Enter some test data and select a .jpg image to upload, and then click Create.

    Criar página

    O aplicativo vai para a Página de índice, mas não mostra uma miniatura do anúncio novo porque o processamento ainda não aconteceu.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. Aguarde um momento e depois atualize a Página de índice para ver a miniatura.Wait a moment and then refresh the Index page to see the thumbnail.

    Página de índice

  11. Clique em Detalhes do anúncio para ver a imagem em tamanho total.Click Details for your ad to see the full-size image.

    Página de detalhes

Você está executando o aplicativo totalmente em seu computador local sem conexão com a nuvem.You've been running the application entirely on your local computer, with no connection to the cloud. O emulador de armazenamento guarda os dados de fila e do Blob em um banco de dados LocalDB do SQL Server Express e o aplicativo armazena os dados do anúncio em outro banco de dados 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. O Entity Framework Code First criou automaticamente o banco de dados de anúncio na primeira vez que o aplicativo Web tentou acessá-lo.Entity Framework Code First automatically created the ad database the first time the web app tried to access it.

Na seção a seguir você configurará a solução para usar os recursos de nuvem do Azure em filas, blobs, e o banco de dados do aplicativo quando ele for executado na nuvem.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. Se você preferisse continuar a executar localmente, porém usando os recursos de armazenamento e banco de dados de nuvem, isso seria possível.If you wanted to continue to run locally but use cloud storage and database resources, you could do that. É apenas questão de definir as cadeias de conexão, que você verá como fazer.It's just a matter of setting connection strings, which you'll see how to do.

Implantar o aplicativo no AzureDeploy the application to Azure

Você seguirá as etapas abaixo para executar o aplicativo na nuvem:You'll do the following steps to run the application in the cloud:

  • Criar um serviço de nuvem do Azure.Create an Azure cloud service.
  • Criar um banco de dados SQL do Azure.Create an Azure SQL database.
  • Crie uma conta de armazenamento do Azure.Create an Azure storage account.
  • Configurar a solução para usar seu banco de dados SQL do Azure quando ele for executado no Azure.Configure the solution to use your Azure SQL database when it runs in Azure.
  • Configurar a solução para usar sua conta de armazenamento do Azure quando ela for executada no Azure.Configure the solution to use your Azure storage account when it runs in Azure.
  • Implantar o projeto em seu serviço de nuvem do Azure.Deploy the project to your Azure cloud service.

Criar um serviço de nuvem do AzureCreate an Azure cloud service

Um serviço de nuvem do Azure é o ambiente em que o aplicativo será executado.An Azure cloud service is the environment the application will run in.

  1. No seu navegador, abra o portal do Azure.In your browser, open the Azure portal.

  2. Clique em Criar um recurso > Computação > Serviço de Nuvem.Click Create a resource > Compute > Cloud Service.

  3. Na caixa de entrada do nome DNS, digite um prefixo de URL para o serviço de nuvem.In the DNS name input box, enter a URL prefix for the cloud service.

    Essa URL precisa ser exclusiva.This URL has to be unique. Você receberá uma mensagem de erro se o prefixo escolhido já estiver sendo usado.You'll get an error message if the prefix you choose is already in use.

  4. Especifique um novo grupo de recursos para o serviço.Specify a new Resource group for the service. Clique em Criar novo e digite um nome na caixa de entrada do Grupo de recursos, como CS_contososadsRG.Click Create new and then type a name in the Resource group input box, such as CS_contososadsRG.

  5. Selecione a região onde deseja implantar o aplicativo.Choose the region where you want to deploy the application.

    Este campo especifica em qual datacenter seu serviço de nuvem será hospedado.This field specifies which datacenter your cloud service will be hosted in. Para um aplicativo de produção, você escolheria a região mais próxima aos seus clientes.For a production application, you'd choose the region closest to your customers. Para este tutorial, escolha a região mais próxima de você.For this tutorial, choose the region closest to you.

  6. Clique em Criar.Click Create.

    Na imagem a seguir, um serviço de nuvem é criado com a URL CSvccontosoads.cloudapp.net.In the following image, a cloud service is created with the URL CSvccontosoads.cloudapp.net.

    Novo serviço de nuvem

Criar um banco de dados SQL do AzureCreate an Azure SQL database

Quando o aplicativo é executado na nuvem, ele usa um banco de dados com base na nuvem.When the app runs in the cloud, it will use a cloud-based database.

  1. No portal do Azure, clique em Criar um recurso > Bancos de Dados > Banco de Dados SQL.In the Azure portal, click Create a resource > Databases > SQL Database.

  2. Na caixa Nome do Banco de Dados , insira contosoads.In the Database Name box, enter contosoads.

  3. No Grupo de recursos, clique em Usar existente e selecione o grupo de recursos usado no serviço de nuvem.In the Resource group, click Use existing and select the resource group used for the cloud service.

  4. Na imagem a seguir, clique em Servidor - Configurar as configurações necessárias e Criar um novo servidor.In the following image, click Server - Configure required settings and Create a new server.

    Túnel para o servidor de banco de dados

    Se a assinatura já tiver um servidor, você poderá selecioná-lo da lista suspensa.Alternatively, if your subscription already has a server, you can select that server from the drop-down list.

  5. Em Nome do servidor , digite csvccontosodbserver.In the Server name box, enter csvccontosodbserver.

  6. Insira um Nome de Logon e Senha de administrador.Enter an administrator Login Name and Password.

    Se você selecionou Criar um novo servidor, não digitará um nome e senha existentes aqui.If you selected Create a new server, you aren't entering an existing name and password here. Você digitará um novo nome e senha que você está definindo agora para usar mais tarde ao acessar o banco de dados.You're entering a new name and password that you're defining now to use later when you access the database. Se você selecionou um servidor criado anteriormente, você será solicitado a fornecer a senha da conta do usuário administrador já criada.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. Selecione o mesmo Local que você escolheu para o serviço de nuvem.Choose the same Location that you chose for the cloud service.

    Quando o banco de dados e o serviço de nuvem estão em datacenters diferentes (regiões diferentes), a latência aumentará e você será cobrado pela largura de banda fora do datacenter.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. A largura de banda em um data center é gratuita.Bandwidth within a data center is free.

  8. Marque a opção Permitir que os serviços do Azure acessem o servidor.Check Allow azure services to access server.

  9. Clique em Selecionar no novo servidor.Click Select for the new server.

    Novo servidor do Banco de Dados SQL

  10. Clique em Criar.Click Create.

Criar uma conta de armazenamento do AzureCreate an Azure storage account

Uma conta de armazenamento do Azure fornece os recursos para dados de blob e fila de armazenamento na nuvem.An Azure storage account provides resources for storing queue and blob data in the cloud.

Em um aplicativo do mundo real, geralmente você cria contas separadas para dados de aplicativos e dados de log, e contas separadas para dados de teste e dados de produção.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. Neste tutorial você usará apenas uma conta.For this tutorial, you'll use just one account.

  1. No portal do Azure, clique em Criar um recurso > Armazenamento > Conta de armazenamento - blob, arquivo, tabela, fila.In the Azure portal, click Create a resource > Storage > Storage account - blob, file, table, queue.

  2. Na caixa da Nome , insira um prefixo de URL.In the Name box, enter a URL prefix.

    Esse prefixo, além do texto que você vê sob a caixa será a URL exclusiva de sua conta de armazenamento.This prefix plus the text you see under the box will be the unique URL to your storage account. Se o prefixo inserido já estiver sendo usado por outra pessoa, você terá que escolher um diferente.If the prefix you enter has already been used by someone else, you'll have to choose a different prefix.

  3. Defina o Modelo de implantação como Clássico.Set the Deployment model to Classic.

  4. Defina a lista suspensa Replicação para Armazenamento com redundância local.Set the Replication drop-down list to Locally redundant storage.

    Quando a replicação geográfica está habilitada para uma conta de armazenamento, o conteúdo armazenado é replicado para um datacenter secundário para habilitar o failover caso ocorra um grande desastre no local principal.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. A replicação geográfica pode incorrer em custos adicionais.Geo-replication can incur additional costs. Para contas de teste e desenvolvimento, geralmente, você não deseja pagar pela replicação geográfica.For test and development accounts, you generally don't want to pay for geo-replication. Para saber mais, confira Criar, gerenciar ou excluir uma conta de armazenamento.For more information, see Create, manage, or delete a storage account.

  5. No Grupo de recursos, clique em Usar existente e selecione o grupo de recursos usado no serviço de nuvem.In the Resource group, click Use existing and select the resource group used for the cloud service.

  6. Defina a lista suspensa Local como a mesma região escolhida para o serviço de nuvem.Set the Location drop-down list to the same region you chose for the cloud service.

    Quando a conta de armazenamento do serviço de nuvem estiver em outros datacenters (outras regiões), a latência será maior e você será cobrado pela largura de banda fora do data center.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. A largura de banda em um data center é gratuita.Bandwidth within a data center is free.

    O grupos de afinidade do Azure fornecem um mecanismo para minimizar a distância entre os recursos em um data center, o que pode reduzir a latência.Azure affinity groups provide a mechanism to minimize the distance between resources in a data center, which can reduce latency. Este tutorial não usa grupos de afinidade.This tutorial does not use affinity groups. Para obter mais informações, consulte Como criar um grupo de afinidade no Azure.For more information, see How to Create an Affinity Group in Azure.

  7. Clique em Criar.Click Create.

    Nova conta de armazenamento

    Na imagem, uma conta de armazenamento é criada com a URL csvccontosoads.core.windows.net.In the image, a storage account is created with the URL csvccontosoads.core.windows.net.

Configurar a solução para usar seu banco de dados SQL do Azure quando ele for executado no AzureConfigure the solution to use your Azure SQL database when it runs in Azure

O projeto Web e o projeto de função de trabalho possuem suas próprias cadeias de conexão de banco de dados, e cada uma precisa apontar para o banco de dados SQL do Azure quando o aplicativo é executado no 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.

Você usará uma transformação de Web.config para a função de trabalho e uma configuração de ambiente de serviço de nuvem para a função de trabalho.You'll use a Web.config transform for the web role and a cloud service environment setting for the worker role.

Observação

Nesta seção e na próxima, você armazenará credenciais nos arquivos de projeto.In this section and the next section, you store credentials in project files. Não armazene dados confidenciais em repositórios de código-fonte público.Don't store sensitive data in public source code repositories.

  1. No projeto ContosoAdsWeb, abra o arquivo de transformação Web.Release.config para o arquivo Web.config do aplicativo, exclua o bloco de comentário que contém um elemento <connectionStrings> e cole o código a seguir no lugar.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>
    

    Deixe o arquivo aberto para edição.Leave the file open for editing.

  2. No portal do Azure, clique em Bancos de Dados SQL no painel esquerdo, clique no banco de dados criado para este tutorial e clique em Mostrar cadeias de conexão.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.

    Mostrar Cadeias de Conexão

    O portal exibe as cadeias de conexão com um espaço reservado para a senha.The portal displays connection strings, with a placeholder for the password.

    Cadeias de conexão

  3. No arquivo de transformação Web.Release.config, exclua {connectionstring} e cole, em seu lugar, a cadeia de conexão ADO.NET do portal do 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. Na cadeia de conexão que você colou no arquivo de transformação Web.Release.config, substitua {your_password_here} pela senha que você criou para o novo Banco de Dados 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. Salve o arquivo.Save the file.

  6. Selecione e copie a cadeia de conexão (sem as aspas) para usar nas etapas a seguir para configurar o projeto de função de trabalho.Select and copy the connection string (without the surrounding quotation marks) for use in the following steps for configuring the worker role project.

  7. Em Gerenciador de Soluções, em Funções no projeto de serviço de nuvem, clique com o botão direito do mouse em ContosoAdsWorker; depois, clique em Propriedades.In Solution Explorer, under Roles in the cloud service project, right-click ContosoAdsWorker and then click Properties.

    Propriedades da função

  8. Clique na guia Configurações .Click the Settings tab.

  9. Altere Configuração de Serviço para Nuvem.Change Service Configuration to Cloud.

  10. Selecione o campo Valor para a configuração ContosoAdsDbConnectionString e cole a cadeia de conexão que você copiou da seção anterior do tutorial.Select the Value field for the ContosoAdsDbConnectionString setting, and then paste the connection string that you copied from the previous section of the tutorial.

    Cadeia de conexão de banco de dados para função de trabalho

  11. Salve as alterações.Save your changes.

Configurar a solução para usar sua conta de armazenamento do Azure quando ela for executada no AzureConfigure the solution to use your Azure storage account when it runs in Azure

As cadeias de conexão da conta de armazenamento do Azure do projeto de função de trabalho e do projeto de função Web são armazenadas nas configurações de ambiente do projeto de serviço de nuvem.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. Para cada projeto existe um conjunto separado de configurações a ser usado quando o aplicativo é executado localmente e quando é executado na nuvem.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. Você atualizará as configurações de ambiente de nuvem para os projetos de função de trabalho e da Web.You'll update the cloud environment settings for both web and worker role projects.

  1. No Gerenciador de Soluções, clique com o botão direito do mouse em ContosoAdsWeb em Funções no projeto ContosoAdsCloudService; depois, clique em Propriedades.In Solution Explorer, right-click ContosoAdsWeb under Roles in the ContosoAdsCloudService project, and then click Properties.

    Propriedades da função

  2. Clique na guia Configurações . Na caixa suspensa Configuração de Serviço selecione Nuvem.Click the Settings tab. In the Service Configuration drop-down box, choose Cloud.

    Configuração de nuvem

  3. Selecione a entrada StorageConnectionString e você verá um botão de reticências ( ... ) na extremidade direita da linha.Select the StorageConnectionString entry, and you'll see an ellipsis (...) button at the right end of the line. Clique no botão para abrir a caixa de diálogo Criar cadeia de conexão da conta de armazenamento .Click the ellipsis button to open the Create Storage Account Connection String dialog box.

    Abra a caixa Criar Cadeia de Conexão

  4. Na caixa de diálogo Criar Cadeia de Conexão de Armazenamento, clique em Sua assinatura, escolha a conta de armazenamento que você criou anteriormente e, em seguida, clique em OK.In the Create Storage Connection String dialog box, click Your subscription, choose the storage account that you created earlier, and then click OK. Se você não tiver feito logon, suas credenciais da conta do Azure serão solicitadas.If you're not already logged in, you'll be prompted for your Azure account credentials.

    Criar cadeia de conexão de armazenamento

  5. Salve as alterações.Save your changes.

  6. Siga o mesmo procedimento que usou para a cadeia de conexão StorageConnectionString para definir a cadeia de conexão 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.

    Essa cadeia de conexão é usada para o log.This connection string is used for logging.

  7. Siga o mesmo procedimento que usou para a função ContosoAdsWeb definir as duas cadeias de conexão da função ContosoAdsWorker.Follow the same procedure that you used for the ContosoAdsWeb role to set both connection strings for the ContosoAdsWorker role. Não se esqueça de definir Configuração de Serviço como Nuvem.Don't forget to set Service Configuration to Cloud.

As configurações do ambiente de função que você configurou usando a interface de usuário do Visual Studio estão armazenadas no seguintes arquivos do projeto 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 - Define os nomes de configuração.ServiceDefinition.csdef - Defines the setting names.
  • ServiceConfiguration.Cloud.cscfg - Fornece os valores para quando o aplicativo for executado na nuvem.ServiceConfiguration.Cloud.cscfg - Provides values for when the app runs in the cloud.
  • ServiceConfiguration.Local.cscfg - Fornece os valores para quando o aplicativo for executado localmente.ServiceConfiguration.Local.cscfg - Provides values for when the app runs locally.

Por exemplo, ServiceDefinition.csdef inclui as seguintes definições:For example, the ServiceDefinition.csdef includes the following definitions:

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

E o arquivo ServiceConfiguration.Cloud.cscfg inclui os valores inseridos para essas configurações no 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>

A configuração <Instances> especifica o número de máquinas virtuais onde o Azure executará o código da função de trabalho.The <Instances> setting specifies the number of virtual machines that Azure will run the worker role code on. A seção Próximas etapas inclui links para mais informações sobre a expansão de um serviço de nuvem.The Next steps section includes links to more information about scaling out a cloud service,

Implantar o projeto no AzureDeploy the project to Azure

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto de nuvem ContosoAdsCloudService e então selecione Publicar.In Solution Explorer, right-click the ContosoAdsCloudService cloud project and then select Publish.

    Menu Publicar

  2. Na etapa Entrar do assistente Publicar aplicativo do Azure, clique em Avançar.In the Sign in step of the Publish Azure Application wizard, click Next.

    Etapa de entrada

  3. Na etapa Configurações do assistente, clique em Avançar.In the Settings step of the wizard, click Next.

    Etapa configurações

    As configurações padrão na guia Avançado são adequadas para este tutorial.The default settings in the Advanced tab are fine for this tutorial. Para obter mais informações sobre a guia avançada, consulte Assistente de publicação de aplicativo do Azure.For information about the advanced tab, see Publish Azure Application Wizard.

  4. Na etapa Resumo, clique em Publicar.In the Summary step, click Publish.

    Etapa de resumo

    A janela Log de atividade do Azure será exibida no Visual Studio.The Azure Activity Log window opens in Visual Studio.

  5. Clique no ícone de seta para a direita para expandir os detalhes da implantação.Click the right arrow icon to expand the deployment details.

    A implantação pode levar cerca de 5 minutos ou mais para ser concluída.The deployment can take up to 5 minutes or more to complete.

    Janela Log de atividade do Azure

  6. Quando o status da implantação for concluído, clique na URL do aplicativo Web para iniciar o aplicativo.When the deployment status is complete, click the Web app URL to start the application.

  7. Você pode testar o aplicativo criando, visualizando e editando alguns anúncios, como fez ao executar o aplicativo localmente.You can now test the app by creating, viewing, and editing some ads, as you did when you ran the application locally.

Observação

Ao finalizar o teste, exclua ou interrompa o serviço de nuvem.When you're finished testing, delete or stop the cloud service. Mesmo que não estiver usando o serviço de nuvem, seus acúmulos serão cobrados porque os recursos do computador virtual serão reservados para o serviço.Even if you're not using the cloud service, it's accruing charges because virtual machine resources are reserved for it. E se você deixá-lo em execução, qualquer um que encontrar sua URL poderá criar e exibir anúncios.And if you leave it running, anyone who finds your URL can create and view ads. No portal do Azure acesse a guia Visão Geral do seu serviço de nuvem e clique no botão Excluir na parte superior da página.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. Se apenas deseja evitar que outros acessem temporariamente o site, em vez disso clique em Parar .If you just want to temporarily prevent others from accessing the site, click Stop instead. Nesse caso, as tarifas continuarão a acumular.In that case, charges will continue to accrue. Você pode seguir um procedimento semelhante para excluir o banco de dados SQL e a conta de armazenamento quando não precisar mais dela.You can follow a similar procedure to delete the SQL database and storage account when you no longer need them.

Criar o aplicativo do zeroCreate the application from scratch

Se ainda não fez o download do aplicativo completo, faça-o agora.If you haven't already downloaded the completed application, do that now. Você copiará os arquivos do projeto baixado para o novo projeto.You'll copy files from the downloaded project into the new project.

A criação do Contoso Ads envolve as seguintes etapas:Creating the Contoso Ads application involves the following steps:

  • Criar um serviço de nuvem na solução Visual Studio.Create a cloud service Visual Studio solution.
  • Atualizar e adicionar pacotes NuGet.Update and add NuGet packages.
  • Definir referências de projeto.Set project references.
  • Configurar cadeias de conexão.Configure connection strings.
  • Adicionar arquivos de código.Add code files.

Após a solução ser criada, você revisará o código exclusivo dos projetos de serviço de nuvem e dos blobs e filas do Azure.After the solution is created, you'll review the code that is unique to cloud service projects and Azure blobs and queues.

Criar um serviço de nuvem na solução Visual StudioCreate a cloud service Visual Studio solution

  1. No Visual Studio, selecione Novo Projeto from the Arquivo .In Visual Studio, choose New Project from the File menu.

  2. No painel esquerdo da caixa de diálogo Novo Projeto, expanda Visual C# e selecione os modelos de Nuvem; em seguida, selecione o modelo de Serviço de Nuvem do 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. Nomeie o projeto e a solução ContosoAdsCloudService e depois clique em OK.Name the project and solution ContosoAdsCloudService, and then click OK.

    Novo Projeto

  4. Na caixa de diálogo Novo Projeto de Serviço de Nuvem , adicione uma função de trabalho e uma função web.In the New Azure Cloud Service dialog box, add a web role and a worker role. Nomeie a função Web ContosoAdsWeb e a função de trabalho ContosoAdsWorker.Name the web role ContosoAdsWeb, and name the worker role ContosoAdsWorker. (Use o ícone da caneta no painel direito para alterar os nomes padrão das funções.)(Use the pencil icon in the right-hand pane to change the default names of the roles.)

    Novo Projeto de Serviço de Nuvem

  5. Quando a caixa de diálogo Novo Projeto ASP.NET da função web for exibida, selecione o modelo MVC e então clique em Alterar Autenticação.When you see the New ASP.NET Project dialog box for the web role, choose the MVC template, and then click Change Authentication.

    Alterar Autenticação

  6. Na caixa de diálogo Alterar Autenticação, escolha Sem Autenticação e clique em OK.In the Change Authentication dialog box, choose No Authentication, and then click OK.

    Sem Autenticação

  7. Na caixa de diálogo Novo projeto ASP.NET, clique em OK.In the New ASP.NET Project dialog, click OK.

  8. No Gerenciador de Soluções, clique com o botão direito do mouse na solução (não aquela de projetos) e selecione Adicionar – Novo Projeto.In Solution Explorer, right-click the solution (not one of the projects), and choose Add - New Project.

  9. Na caixa de diálogo Adicionar Novo Projeto, escolha Windows em Visual C# no painel esquerdo e clique no modelo Biblioteca de Classes.In the Add New Project dialog box, choose Windows under Visual C# in the left pane, and then click the Class Library template.

  10. Nomeie o projeto ContosoAdsCommon, e depois clique em OK.Name the project ContosoAdsCommon, and then click OK.

    Você precisa usar como referência o contexto e o modelo de dados do Entity Framework para os projetos de função de trabalho e da Web.You need to reference the Entity Framework context and the data model from both web and worker role projects. Como alternativa, você pode definir as classes relacionadas ao EF no projeto de função Web e usar esse projeto como referência para o projeto de função de trabalho.As an alternative, you could define the EF-related classes in the web role project and reference that project from the worker role project. Na abordagem alternativa, no entanto, o seu projeto de função de trabalho teria uma referência para assemblies da Web dos quais não precisa.But in the alternative approach, your worker role project would have a reference to web assemblies that it doesn't need.

Atualizar e adicionar pacotes NuGetUpdate and add NuGet packages

  1. Abra a caixa de diálogo Gerenciar Pacotes NuGet para a solução.Open the Manage NuGet Packages dialog box for the solution.

  2. Na parte superior da janela, selecione Atualizações.At the top of the window, select Updates.

  3. Procure o pacote WindowsAzure.Storage e, se ele estiver na lista, selecione-o e selecione os projetos da Web e de trabalho em que ele será atualizado e clique em Atualizar.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.

    A biblioteca de armazenamento do cliente é atualizada com mais frequência que os modelos de projetos do Visual Studio, por isso, você descobrirá com frequência que a versão em um projeto que acabou de ser criado precisa ser atualizada.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. Na parte superior da janela, selecione Procurar.At the top of the window, select Browse.

  5. Encontre o pacote NuGet do EntityFramework e instale-o em todos os três projetos.Find the EntityFramework NuGet package, and install it in all three projects.

  6. Encontre o pacote NuGet Microsoft.WindowsAzure.ConfigurationManager e instale-o no projeto de função de trabalho.Find the Microsoft.WindowsAzure.ConfigurationManager NuGet package, and install it in the worker role project.

Definir referências de projetoSet project references

  1. No projeto ContosoAdsWeb, defina uma referência para o projeto ContosoAdsCommon.In the ContosoAdsWeb project, set a reference to the ContosoAdsCommon project. Clique com o botão direito do mouse no projeto ContosoAdsWeb e depois clique em Referências - Adicionar Referências.Right-click the ContosoAdsWeb project, and then click References - Add References. Na caixa de diálogo Gerenciador de Referências, selecione Solução – Projetos no painel esquerdo, selecione ContosoAdsCommon e depois clique em OK.In the Reference Manager dialog box, select Solution – Projects in the left pane, select ContosoAdsCommon, and then click OK.

  2. No projeto ContosoAdsWorker, defina uma referência ao projeto ContosoAdsCommon.In the ContosoAdsWorker project, set a reference to the ContosoAdsCommon project.

    ContosoAdsCommon conterá o modelo de dados e a classe de contexto de Entity Framework, que serão usados por front-end e back-end.ContosoAdsCommon will contain the Entity Framework data model and context class, which will be used by both the front-end and back-end.

  3. No projeto ContosoAdsWorker, defina uma referência para System.Drawing.In the ContosoAdsWorker project, set a reference to System.Drawing.

    Este assembly é usado pelo back-end para converter imagens em miniaturas.This assembly is used by the back-end to convert images to thumbnails.

Configurar cadeias de conexãoConfigure connection strings

Nesta seção iremos configurar o Armazenamento do Azure e as cadeias de conexão do SQL para o teste local.In this section, you configure Azure Storage and SQL connection strings for testing locally. As instruções de implantação fornecidas anteriormente no tutorial explicam como definir as cadeias de conexão para quando o aplicativo for executado na nuvem.The deployment instructions earlier in the tutorial explain how to set up the connection strings for when the app runs in the cloud.

  1. No projeto ContosoAdsWeb, abra o arquivo Web.config do aplicativo e insira o elemento connectionStrings a seguir após o elemento 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>
    

    Se você estiver usando o Visual Studio 2015 ou superior, substitua "v11.0" por "MSSQLLocalDB".If you're using Visual Studio 2015 or higher, replace "v11.0" with "MSSQLLocalDB".

  2. Salve as alterações.Save your changes.

  3. No projeto ContosoAdsCloudService, clique com o botão direito do mouse em ContosoAdsWeb abaixo de Funções e depois clique em Propriedades.In the ContosoAdsCloudService project, right-click ContosoAdsWeb under Roles, and then click Properties.

    Propriedades da função

  4. Na janela Propriedades de ContosoAdsWeb [Função] , clique na guia Configurações e, em seguida, em Adicionar Configuração.In the ContosoAdsWeb [Role] properties window, click the Settings tab, and then click Add Setting.

    Deixe Configuração de Serviço definida como Todas as configurações.Leave Service Configuration set to All Configurations.

  5. Adicione uma configuração chamada StorageConnectionString.Add a setting named StorageConnectionString. Defina Tipo como ConnectionString e defina Valor como UseDevelopmentStorage=true.Set Type to ConnectionString, and set Value to UseDevelopmentStorage=true.

    Nova cadeia de conexão

  6. Salve as alterações.Save your changes.

  7. Siga o mesmo procedimento para adicionar uma cadeia de conexão nas propriedades da função ContosoAdsWorker.Follow the same procedure to add a storage connection string in the ContosoAdsWorker role properties.

  8. Ainda na janela de propriedades de ContosoAdsWorker [Role] , adicione outra cadeia de conexão:Still in the ContosoAdsWorker [Role] properties window, add another connection string:

    • Nome: ContosoAdsDbConnectionStringName: ContosoAdsDbConnectionString

    • Digite: CadeiaType: String

    • Valor: Cole a mesma cadeia de conexão usada para o projeto de função Web.Value: Paste the same connection string you used for the web role project. (O exemplo a seguir é para o Visual Studio 2013.(The following example is for Visual Studio 2013. Não se esqueça de alterar a fonte de dados se for copiar este exemplo e se estiver usando o Visual Studio 2015 ou superior.)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;
      

Adicionar arquivos de códigoAdd code files

Nesta seção, você copiará códigos da solução baixada para a nova solução.In this section, you copy code files from the downloaded solution into the new solution. As seções a seguir mostrarão e explicarão as partes principais desse código.The following sections will show and explain key parts of this code.

Para adicionar arquivos a um projeto ou pasta, clique com o botão direito do mouse em Adicionar - Item Existente.To add files to a project or a folder, right-click the project or folder and click Add - Existing Item. Selecione os arquivos que deseja e então clique em Adicionar.Select the files you want and then click Add. Se receber uma solicitação para confirmar se deseja substituir os arquivos existentes, clique em Sim.If asked whether you want to replace existing files, click Yes.

  1. No projeto ContosoAdsCommon, exclua o arquivo Class1.cs e substitua-o pelos arquivos Ad.cs e ContosoAdscontext.cs do projeto baixado.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. No projeto ContosoAdsWeb, adicione os seguintes arquivos do projeto baixado.In the ContosoAdsWeb project, add the following files from the downloaded project.

    • Global.asax.csGlobal.asax.cs.
    • Na pasta Views\Shared: _Layout.cshtml.In the Views\Shared folder: _Layout.cshtml.
    • Na pasta Views\Home: Index.cshtml.In the Views\Home folder: Index.cshtml.
    • Na pasta Controllers: AdController.cs.In the Controllers folder: AdController.cs.
    • Na pasta Views\Ad (crie a pasta primeiro): cinco arquivos .cshtml.In the Views\Ad folder (create the folder first): five .cshtml files.
  3. No projeto ContosoAdsWorker, adicione WorkerRole.cs do projeto baixado.In the ContosoAdsWorker project, add WorkerRole.cs from the downloaded project.

Você pode criar e executar os aplicativos conforme explicado anteriormente no tutorial e o aplicativo usará os recursos locais de banco de dados e emulador de armazenamento.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.

As seções a seguir explicam o código relacionado ao trabalho com os blobs e filas do ambiente do Azure.The following sections explain the code related to working with the Azure environment, blobs, and queues. Este tutorial não explica como criar controladores e exibições MVC usando scaffolding, como escrever código do Entity Framework que funciona com bancos de dados do SQL Server ou as noções básicas da programação assíncrona no 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. Para obter informações sobre esses tópicos, consulte os seguintes recursos:For information about these topics, see the following resources:

ContosoAdsCommon - Ad.csContosoAdsCommon - Ad.cs

O arquivo Ad.cs file define uma enumeração para categorias de anúncios e uma classe de entidade POCO para as informações de anúncios.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

A classe ContosoAdsContext especifica que a classe de anúncio é usada em uma coleção de DbSet e qual Entity Framework será armazenada em um banco de dados 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; }
}

A classe possui dois construtores.The class has two constructors. O primeiro deles é usado pelo projeto Web e especifica o nome de uma cadeia de conexão armazenada no arquivo Web.config.The 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. O segundo construtor permite transmitir a cadeia de conexão real usada para o projeto de função de trabalho, pois ele não tem um arquivo 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. Foi mostrado anteriormente onde essa cadeia de conexão foi armazenada, e você verá mais adiante como o código recupera a cadeia de conexão quando ele cria uma instância de classe 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

O código que é chamado do método Application_Start criará um contêiner de blob images e uma fila images, se ainda não existirem.Code that is called from the Application_Start method creates an images blob container and an images queue if they don't already exist. Isso garante que sempre que você começar a usar uma nova conta de armazenamento, ou começar a usar o emulador de armazenamento em um novo computador, o contêiner do blob e a fila necessários serão criados automaticamente.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.

O código obtém acesso à conta de armazenamento usando a cadeia de conexão de armazenamento do arquivo .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"));

Em seguida, ele obtém uma referência para o contêiner do blob de imagens , cria o contêiner se ele ainda não existe e define permissões de acesso no novo contêiner.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. Por padrão, os novos contêineres permitem que somente clientes com credenciais da conta de armazenamento acessem os blobs.By default, new containers only allow clients with storage account credentials to access blobs. O site precisa que os blobs para o público para poder exibir imagens usando URLs que apontam para os blobs de imagem.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
        });
}

Um código similar obtém uma referência para a fila de imagens e cria uma nova fila.Similar code gets a reference to the images queue and creates a new queue. Nesse caso, nenhuma alteração de permissão é necessária.In this case, no permissions change is needed.

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

ContosoAdsWeb – _Layout.cshtmlContosoAdsWeb - _Layout.cshtml

O arquivo _Layout.cshtml define o nome do aplicativo no cabeçalho e no rodapé e cria uma entrada de menu "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

O arquivo Views\Home\Index.cshtml exibe links de categoria na home page.The Views\Home\Index.cshtml file displays category links on the home page. Os links passam o valor inteiro da enumeração Category em uma variável querystring para a página Índice de anúncio.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

No arquivo AdController.cs, o construtor chama o método InitializeStorage para criar os objetos da Biblioteca do Cliente do Armazenamento do Azure que fornecem uma API para trabalhar com blobs e filas.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.

Em seguida, o código obtém uma referência para o contêiner do blob de imagens como visto anteriormente em Global.asax.cs.Then the code gets a reference to the images blob container as you saw earlier in Global.asax.cs. Enquanto faz isso ele define uma política de recuperação padrão apropriada para um aplicativo Web.While doing that it sets a default retry policy appropriate for a web app. A política de recuperação de retirada exponencial padrão pode fazer com que o aplicativo Web pare de responder por mais de um minuto em tentativas repetidas de uma falha transitória.The default exponential backoff retry policy could hang the web app for longer than a minute on repeated retries for a transient fault. A política de recuperação especificada aqui aguarda três segundos após cada tentativa, até três tentativas.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");

Código similar obtém uma referência para a fila de imagens .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");

A maior parte do código do controlador é típica para trabalhar com um modelo de dados do Entity Framework usando uma classe DbContext.Most of the controller code is typical for working with an Entity Framework data model using a DbContext class. Uma exceção é o método HttpPost Create , que atualiza um arquivo e o salva no armazenamento do blob.An exception is the HttpPost Create method, which uploads a file and saves it in blob storage. O associador de modelo fornece um objeto HttpPostedFileBase para o método.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)

Se o usuário selecionou um arquivo para carregamento, o código carrega o arquivo, salva o arquivo em um blob e atualiza o registro do banco de dados do anúncio com uma URL que aponta para o blob.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();
}

O código que não é carregado está no método UploadAndSaveBlobAsync .The code that does the upload is in the UploadAndSaveBlobAsync method. Ele cria um nome de GUID para o blob, carrega e salva o arquivo e retorna uma referência para o blob salvo.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;
}

Depois de carregar um blob e atualizar o banco de dados, o método Create HttpPost criará uma mensagem da fila para informar o processo back-end que uma imagem está pronta para conversão em uma miniatura.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);

O código para o método Edit HttpPost é semelhante, exceto pelo fato de que se o usuário seleciona um novo arquivo de imagem, quaisquer blobs existentes deverão ser excluídos.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();
}

O próximo exemplo mostra o código que exclui blobs quando você exclui um anúncio.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 e Details.cshtmlContosoAdsWeb - Views\Ad\Index.cshtml and Details.cshtml

O arquivo Index.cshtml exibe miniaturas com os outros dados de anúncio.The Index.cshtml file displays thumbnails with the other ad data.

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

O arquivo Details.cshtml exibe a imagem em tamanho real.The Details.cshtml file displays the full-size image.

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

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

Os arquivos Create.cshtml e Edit.cshtml especificam a codificação de formulário que habilita o controlador a obter o objeto 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" }))

Um elemento <input> informa o navegador para fornecer uma caixa de diálogo de seleção de arquivo.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 - Método OnStartContosoAdsWorker - WorkerRole.cs - OnStart method

O ambiente da função de trabalho do Azure chama o método OnStart na classe WorkerRole quando a função de trabalho é iniciada, e chama o método Run quando o método OnStart é concluído.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.

O método OnStart obtém a cadeia de conexão do banco de dados do arquivo .cscfg e a transmite para a classe DbContext do Entity Framework.The OnStart method gets the database connection string from the .cscfg file and passes it to the Entity Framework DbContext class. O provedor SQLClient é usado por padrão para que o provedor não precisar ser especificado.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);

Depois disso, o método obtém uma referência para a conta de armazenamento e cria a fila e o contêiner do blob, se eles não existirem.After that, the method gets a reference to the storage account and creates the blob container and queue if they don't exist. O código para isso é semelhante àquele já visto no método da função Web Application_Start .The code for that is similar to what you already saw in the web role Application_Start method.

ContosoAdsWorker - WorkerRole.cs - Método de execuçãoContosoAdsWorker - WorkerRole.cs - Run method

O método Run é chamado quando o método OnStart conclui seu trabalho de inicialização.The Run method is called when the OnStart method finishes its initialization work. O método executa um loop infinito que procura novas mensagens na fila e as processa quando chegam.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);
        }
    }
}

Após cada interação do loop, se nenhuma mensagem foi encontrada na fila, o programa é suspenso durante um segundo.After each iteration of the loop, if no queue message was found, the program sleeps for a second. Isso evita que a função de trabalho utilize tempo excessivo de CPU e incorra em gastos de transação de armazenamento.This prevents the worker role from incurring excessive CPU time and storage transaction costs. A equipe de auxílio ao cliente da Microsoft relatou uma história sobre um desenvolvedor que esqueceu de incluir isso, implantou em produção e saiu de férias.The Microsoft Customer Advisory Team tells a story about a developer who forgot to include this, deployed to production, and left for vacation. Quando eles são revertidos, seu custo de supervisão é maior do que as férias.When they got back, their oversight cost more than the vacation.

Algumas vezes o conteúdo de uma mensagem da fila causa um erro no processamento.Sometimes the content of a queue message causes an error in processing. Isso é chamado de mensagem suspeita, e se você acabou de registrar um erro e reiniciou o loop, pode tentar processar essa mensagem infinitamente.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. Portanto, o bloco de captura inclui uma instrução que verifica quantas vezes o aplicativo tentou processar a mensagem atual, e se isso aconteceu mais de 5 vezes, a mensagem é excluída da fila.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 é chamado quando uma mensagem em fila é encontrada.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);
}

Esse código lê o banco de dados para obter a URL da imagem, converte a imagem para uma miniatura, salva a miniatura em um blob, atualiza o banco de dados com a URL do blob da miniatura e exclui a mensagem da fila.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.

Observação

O código no método ConvertImageToThumbnailJPG usa classes no namespace System.Drawing para simplificar.The code in the ConvertImageToThumbnailJPG method uses classes in the System.Drawing namespace for simplicity. Entretanto, as classes nesse namespace foram projetadas para uso nos formulários do Windows.However, the classes in this namespace were designed for use with Windows Forms. Elas não têm suporte para uso em um serviço Windows ou ASP.NET.They are not supported for use in a Windows or ASP.NET service. Para obter mais informações sobre opções de processamento de imagem, consulte Geração dinâmica de imagem e Visão aprofundada de redimensionamento de imagens.For more information about image-processing options, see Dynamic Image Generation and Deep Inside Image Resizing.

Solução de problemasTroubleshooting

Caso algo não funcione enquanto você estiver seguindo as instruções nesse tutorial, veja a seguir alguns erros comuns e como resolvê-los.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

O objeto RoleEnvironment é fornecido pelo Azure quando você executa uma aplicação no Azure ou quando você executa localmente usando o emulador de computação do 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. Se você obter esse erro quando estiver executando localmente, certifique-se de que definiu o projeto ContosoAdsCloudService como o projeto de inicialização.If you get this error when you're running locally, make sure that you have set the ContosoAdsCloudService project as the startup project. Isso define o projeto para ser executado usando o emulador de computação do Azure.This sets up the project to run using the Azure compute emulator.

Uma das coisas para as quais o aplicativo usa o RoleEnvironment do Azure é para obter os valores de cadeia de conexão armazenados nos arquivos .cscfg e, portanto, uma nova causa dessa exceção é uma cadeia de conexão perdida.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. Certifique-se de que criou a configuração StorageConnectionString para as configurações local e de nuvem no projeto ContosoAdsWeb, e de que criou as duas cadeias de conexão para as ambas as configurações do projeto 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. Se fizer uma pesquisa Localizar Tudo para StorageConnectionString na solução inteira, você deverá vê-la 9 vezes em 6 filas.If you do a Find All search for StorageConnectionString in the entire solution, you should see it 9 times in 6 files.

Não é possível substituir porta xxx.Cannot override to port xxx. O valor abaixo do mínimo permitido para a nova porta é de 8080 para o protocolo httpNew port below minimum allowed value 8080 for protocol http

Tente alterar o número da porta usado pelo projeto Web.Try changing the port number used by the web project. Clique com o botão direito do mouse no projeto ContosoAdsWeb e depois clique em Propriedades.Right-click the ContosoAdsWeb project, and then click Properties. Clique na guia Web e depois altere o número da porta na configuração URL do projeto.Click the Web tab, and then change the port number in the Project Url setting.

Para obter uma outra alternativa que possa resolver o problema, consulte a seção a seguir.For another alternative that might resolve the problem, see the following section.

Outros erros que podem ocorrer ao executar localmenteOther errors when running locally

Por padrão, os novos projetos de serviço de nuvem usam o emulador de computação expresso do Azure para simular o ambiente do Azure.By default new cloud service projects use the Azure compute emulator express to simulate the Azure environment. Essa é uma versão leve do emulador de computação completo e em algumas condições o emulador completo funcionará quando a versão expressa não funcionar.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.

Para alterar o projeto a fim de usar o emulador completo, clique com o botão direito do mouse no projeto ContosoAdsCloudService e depois clique em Propriedades.To change the project to use the full emulator, right-click the ContosoAdsCloudService project, and then click Properties. Na janela Propriedades, clique na guia Web e depois clique no botão de opção Usar Emulador Completo.In the Properties window click the Web tab, and then click the Use Full Emulator radio button.

Para executar o aplicativo com o emulador completo, abra o Visual Studio com privilégios de administrador.In order to run the application with the full emulator, you have to open Visual Studio with administrator privileges.

Próximas etapasNext steps

Os aplicativo Contoso Ads foi, intencionalmente, mantido simples para este tutorial de introdução.The Contoso Ads application has intentionally been kept simple for a getting-started tutorial. Por exemplo, ele não implementa injeção de dependência ou os padrões de unidade de trabalho e repositório, ele não usa uma interface para registro em log, não usa Migrações Iniciais de Código de EF para gerenciar as alterações de modelo de dados ou Resiliência de Conexão de EF para gerenciar erros de rede transitórios, e assim por diante.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.

Estes são alguns aplicativos função Web de serviço de nuvem que demonstram práticas mais reais de codificação, listados do menos para o mais complexo:Here are some cloud service sample applications that demonstrate more real-world coding practices, listed from less complex to more complex:

Para obter informações sobre como desenvolver para a nuvem, consulte Criando aplicativos de nuvem do mundo real no Azure.For general information about developing for the cloud, see Building Real-World Cloud Apps with Azure.

Para assistir a um vídeo de introdução às melhores práticas e padrões de armazenamento do Azure Armazenamento do Microsoft Azure – O que há de novo, melhores práticas e padrões.For a video introduction to Azure Storage best practices and patterns, see Microsoft Azure Storage – What's New, Best Practices and Patterns.

Para obter mais informações, consulte os seguintes recursos:For more information, see the following resources: