Introdução ao Cloud Services do Azure e ao ASP.NETGet started with Azure Cloud Services and ASP.NET

Descrição geralOverview

Este tutorial mostra como criar uma aplicação do .NET de várias camadas com um front-end do MVC do ASP.NET e como implementá-lo num serviço em 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. A aplicação utiliza a Base 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. Pode transferir o projeto do Visual Studio da Galeria de Códigos do MSDN.You can download the Visual Studio project from the MSDN Code Gallery.

O tutorial mostra como compilar e executar a aplicação localmente, como implementá-la no Azure e executá-la na cloud e como compilá-la 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. Pode começar por compilar do zero e, posteriormente, realizar os passos de teste e implementação, se preferir.You can start by building from scratch and then do the test and deploy steps afterward if you prefer.

Aplicação de Anúncios da ContosoContoso Ads application

A aplicação é um BBS de publicidade.The application is an advertising bulletin board. Os utilizadores criam um anúncio através da introdução de texto e carregamento de uma imagem.Users create an ad by entering text and uploading an image. Podem ver uma lista de anúncios com imagens em miniatura e ver a imagem de tamanho completo quando selecionarem 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

A aplicação utiliza o padrão de trabalho centrado em filas para transferir o trabalho intensivo da CPU de criar 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 trabalhos WebAlternative architecture: App Service and WebJobs

Este tutorial mostra como executar front-end e back-end num serviço em 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 Azure app 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 utiliza WebJobs, consulte Introdução ao SDK de 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 adaptam ao seu cenário, consulte comparação de serviço Azure app, 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 irá aprenderWhat you'll learn

  • Como ativar o computador para a programação do Azure instalando o Azure SDK.How to enable your machine for Azure development by installing the Azure SDK.
  • Como criar um projeto de serviço em nuvem do Visual Studio com uma função da Web e uma função de trabalho do 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 em nuvem localmente, utilizando o emulador do Storage do Azure.How to test the cloud service project locally, using the Azure storage emulator.
  • Como publicar o projeto de nuvem num serviço em nuvem do Azure e testá-lo utilizando uma conta do Storage do Azure.How to publish the cloud project to an Azure cloud service and test using an Azure storage account.
  • Como carregar ficheiros e armazená-los no serviço Blob do Azure.How to upload files and store them in the Azure Blob service.
  • Como utilizar o serviço Fila do Azure para a comunicação entre camadas.How to use the Azure Queue service for communication between tiers.

Pré-requisitosPrerequisites

O tutorial parte do princípio de que compreende os conceitos básicos dos Cloud Services do Azure como a terminologia função da Web e 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 parte do princípio de que sabe como trabalhar com o MVC do ASP.NET ou com projetos de Formulários Web no Visual Studio.It also assumes that you know how to work with ASP.NET MVC or Web Forms projects in Visual Studio. A aplicação de exemplo utiliza o MVC, mas a maioria do tutorial também se aplica aos Formulários Web.The sample application uses MVC, but most of the tutorial also applies to Web Forms.

Pode executar a aplicação localmente sem precisar de uma subscrição do Azure, mas necessitará de uma para implementar a aplicação na cloud.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 tiver uma conta, pode ativar os seus benefícios de subscritor MSDN ou inscrever-se numa 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 não tiver nenhum destes produtos, o Visual Studio poderá ser instalado automaticamente ao instalar o Azure SDK.If you don't have one of these, Visual Studio may be installed automatically when you install the Azure SDK.

Arquitetura da aplicaçãoApplication architecture

A aplicação armazena anúncios numa SQL Database, utilizando o Entity Framework Code First para criar as tabelas e aceder aos 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, a base de dados armazena dois URLs, um para a imagem de tamanho completo e outro 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 utilizador carrega uma imagem, o front-end em execução numa função da Web armazena a imagem num blob do Azure e armazena as informações do anúncio na base de dados com um 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, escreve uma mensagem para uma fila do Azure.At the same time, it writes a message to an Azure queue. Um processo de back-end em execução numa função de trabalho consulta periodicamente a fila para verificar se existem novas mensagens.A back-end process running in a worker role periodically polls the queue for new messages. Quando for apresentada uma nova mensagem, a função de trabalho cria uma miniatura dessa imagem e atualiza o campo da base de dados de URLs de miniaturas 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 seguinte mostra como interagem as partes da aplicação.The following diagram shows how the parts of the application interact.

Arquitetura dos Anúncios da Contoso

Configurar o ambiente de desenvolvimentoSet up the development environment

Para começar, configure seu ambiente de desenvolvimento com o Visual Studio e o Azure SDK.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 estiver a utilizar o Visual Studio 2019, não é necessária nenhuma configuração adicional para o ambiente de desenvolvimento.If you're using Visual Studio 2019, no additional setup is needed for the development environment.

  • No Visual Studio 2015, clique na seguinte ligação para instalar o Azure SDK para Visual Studio 2015.For Visual Studio 2015, click the following link to install the Azure SDK for Visual Studio 2015.

  • No Visual Studio 2013, clique na seguinte ligação para instalar o Azure SDK para Visual Studio 2013.For Visual Studio 2013, click the following link to install the Azure SDK for Visual Studio 2013.

  • Se não tiver o Visual Studio instalado, utilize o seguinte para instalar Visual Studio 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.

Nota

Dependendo do número de dependências SDK que já possui no seu computador, instalar o SDK pode demorar muito tempo, de alguns 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.

Transferir e executar a solução concluídaDownload and run the completed solution

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

  2. Inicie o Visual Studio.Start Visual Studio.

  3. No menu Ficheiro, escolha Abrir Projeto, navegue para onde transferiu a solução e, em seguida, abra o ficheiro da solução.From the File menu choose Open Project, navigate to where you downloaded the solution, and then open the solution file.

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

    Por predefinição, o Visual Studio restaura automaticamente o conteúdo do pacote NuGet, que não estava incluído no ficheiro .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. Para tal, vá para a caixa de diálogo Gerir Pacotes NuGet da Solução e clique 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 Explorador de Soluções, certifique-se de que ContosoAdsCloudService é selecionado como o projeto de arranque.In Solution Explorer, make sure that ContosoAdsCloudService is selected as the startup project.

  6. Se estiver a utilizar o Visual Studio 2015 ou superior, altere a cadeia de ligação do SQL Server no ficheiro Web.config da aplicação do projeto ContosoAdsWeb e no ficheiroServiceConfiguration.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. Prima CTRL+F5 para executar a aplicação.Press CTRL+F5 to run the application.

    Quando executa localmente um projeto do serviço em nuvem, o Visual Studio invoca automaticamente o emulador de computação do Azure 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 utiliza os recursos do computador para simular os ambientes da função da Web e da 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 utiliza uma base de dados SQL Server Express LocalDB para simular o armazenamento na nuvem do Azure.The storage emulator uses a SQL Server Express LocalDB database to simulate Azure cloud storage.

    Quando executar um projeto do serviço em nuvem pela primeira vez, demorará um minuto ou mais até que os emuladores arranquem.The first time you run a cloud service project, it takes a minute or so for the emulators to start up. Quando o arranque dos emuladores estiver concluído, o browser predefinido é aberto na home page da aplicação.When emulator startup is finished, the default browser opens to the application home page.

    Arquitetura dos Anúncios da Contoso

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

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

    Criar página

    A aplicação acede à página Índice, mas não mostra nenhuma miniatura do novo anúncio, porque esse processamento ainda não ocorreu.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, em seguida, atualize a página Índice para ver a miniatura.Wait a moment and then refresh the Index page to see the thumbnail.

    Página Índice

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

    Página Detalhes

A aplicação tem estado a ser executada inteiramente no computador local, sem ligaçã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 armazena os dados de fila e blob numa base de dados do SQL Server Express LocalDB. A aplicação armazena os dados do anúncio noutra base 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 a base de dados de anúncios da primeira vez que a aplicação Web tentou aceder à mesma.Entity Framework Code First automatically created the ad database the first time the web app tried to access it.

Na secção seguinte, irá configurar a solução para utilizar recursos em nuvem do Azure para filas, blobs e para base de dados de aplicações quando for executada 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 quisesse continuar a executar a aplicação localmente, mas utilizar recursos da base de dados e do armazenamento na cloud, poderia fazê-lo.If you wanted to continue to run locally but use cloud storage and database resources, you could do that. Para tal ,bastaria definir cadeias de ligação (instruções a seguir).It's just a matter of setting connection strings, which you'll see how to do.

Implementar a aplicação no AzureDeploy the application to Azure

Terá de efetuar os passos seguintes para executar a aplicação na nuvem:You'll do the following steps to run the application in the cloud:

  • Crie um serviço em nuvem do Azure.Create an Azure cloud service.
  • Crie uma Base de Dados SQL do Azure.Create an Azure SQL database.
  • Crie uma conta do Storage do Azure.Create an Azure storage account.
  • Configure a solução para utilizar a Base de Dados SQL do Azure, quando é executada no Azure.Configure the solution to use your Azure SQL database when it runs in Azure.
  • Configure a solução para utilizar a sua conta do Storage do Azure, quando é executada no Azure.Configure the solution to use your Azure storage account when it runs in Azure.
  • Implemente o projeto no serviço em nuvem do Azure.Deploy the project to your Azure cloud service.

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

Um serviço em nuvem do Azure é o ambiente onde a aplicação irá ser executada.An Azure cloud service is the environment the application will run in.

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

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

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

    Este URL tem de ser exclusivo.This URL has to be unique. Obterá uma mensagem de erro se o prefixo que escolher já estiver a ser utilizado.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, em seguida, escreva 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 pretende implementar a aplicação.Choose the region where you want to deploy the application.

    Este campo especifica em qual datacenter será alojado o serviço em nuvem.This field specifies which datacenter your cloud service will be hosted in. Para uma aplicação de produção, deverá escolher a região mais próxima dos 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 si.For this tutorial, choose the region closest to you.

  6. Clique em Criar.Click Create.

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

    Novo Serviço em Nuvem

Criar uma Base de Dados SQL do AzureCreate an Azure SQL database

Quando a aplicação é executada na nuvem, utilizará uma base de dados baseada 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 > Bases de Dados > Base de Dados SQL.In the Azure portal, click Create a resource > Databases > SQL Database.

  2. Na caixa Nome da Base de Dados, introduza contosoads.In the Database Name box, enter contosoads.

  3. No grupo de Recursos, clique em Utilizar existente e selecione o grupo de recursos utilizado para o serviço cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.

  4. Na imagem seguinte, clique em Servidor - configurar definições obrigató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 bases de dados

    Em alternativa, se a sua subscrição já tiver um servidor, pode selecionar esse servidor na lista pendente.Alternatively, if your subscription already has a server, you can select that server from the drop-down list.

  5. Na caixa Nome do servidor , introduza csvccontosodbserver.In the Server name box, enter csvccontosodbserver.

  6. Introduza um Nome de Início de Sessão e Palavra-Passe de administrador.Enter an administrator Login Name and Password.

    Se tiver selecionado Criar um novo servidor, não introduzirá um nome e palavra-passe existentes aqui.If you selected Create a new server, you aren't entering an existing name and password here. Deverá introduzir um novo nome e palavra-passe, que definirá agora para utilizar posteriormente quando aceder à base de dados.You're entering a new name and password that you're defining now to use later when you access the database. Se tiver selecionado um servidor criado anteriormente, será solicitada a palavra-passe da conta de utilizador administrativo criada anteriormente.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. Escolha a mesma Localização que escolheu para o serviço cloud.Choose the same Location that you chose for the cloud service.

    Se o serviço em nuvem e a base de dados estiverem em datacenters diferentes (regiões diferentes), a latência aumentará e será ser-lhe-á debitada a 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 dentro de um datacenter é gratuita.Bandwidth within a data center is free.

  8. Marque Permitir o acesso dos serviços do Azure ao servidor.Check Allow azure services to access server.

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

    Novo servidor da Base de Dados SQL

  10. Clique em Criar.Click Create.

Criar uma conta do Storage do AzureCreate an Azure storage account

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

Numa aplicação real, normalmente criaria contas separadas para os dados da aplicação versus os dados de registo e contas separadas para os dados de teste versus os 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. Para este tutorial, utilizará 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, ficheiro, tabela, fila.In the Azure portal, click Create a resource > Storage > Storage account - blob, file, table, queue.

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

    Este prefixo e o texto que vê por baixo da caixa será o URL exclusivo para a sua conta do Storage.This prefix plus the text you see under the box will be the unique URL to your storage account. Se o prefixo que introduzir já tiver sido utilizado por outra pessoa, terá de 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 implementação como Clássico.Set the Deployment model to Classic.

  4. Defina a lista pendente Replicação para Armazenamento localmente redundante.Set the Replication drop-down list to Locally redundant storage.

    Quando a georreplicação está ativada para uma conta de armazenamento, o conteúdo armazenado é replicado para um datacenter secundário para ativar a ativação pós-falha, se ocorrer um desastre grave na localização primária.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 georreplicação pode implicar custos adicionais.Geo-replication can incur additional costs. Para contas de teste e de desenvolvimento, normalmente não deseja pagar a georreplicação.For test and development accounts, you generally don't want to pay for geo-replication. Para obter mais informações, consulte Criar, gerir ou eliminar uma conta de armazenamento.For more information, see Create, manage, or delete a storage account.

  5. No grupo de Recursos, clique em Utilizar existente e selecione o grupo de recursos utilizado para o serviço cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.

  6. Defina a Localização na lista pendente para a mesma região que selecionou para o serviço cloud.Set the Location drop-down list to the same region you chose for the cloud service.

    Se o serviço em nuvem e a conta do Storage estiverem em datacenters diferentes (regiões diferentes), a latência aumentará e será ser-lhe-á debitada a largura de banda fora do datacenter.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 dentro de um datacenter é gratuita.Bandwidth within a data center is free.

    Os grupos de afinidades do Azure fornecem um mecanismo para minimizar a distância entre os recursos num data center, o que poderá 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 utiliza grupos de afinidades.This tutorial does not use affinity groups. Para obter mais informações, consulte Como Criar um Grupo de Afinidades no Azure.For more information, see How to Create an Affinity Group in Azure.

  7. Clique em Criar.Click Create.

    Nova conta do Storage

    Na imagem, é criada uma conta do Storage com o 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 utilizar a Base de Dados SQL do Azure quando for executada 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 têm a sua própria cadeia de ligação de base de dados, e cada uma tem de apontar para a Base de Dados SQL do Azure quando a aplicação for executada 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.

Utilizará uma transformação Web.config para a função da Web e uma definição de ambiente de serviço em 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.

Nota

Nesta secção e na secção seguinte, as credenciais serão armazenadas nos ficheiros 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úblicos.Don't store sensitive data in public source code repositories.

  1. No projeto ContosoAdsWeb, abra o ficheiro de transformação Web.Release.config para o ficheiro Web.config da aplicação, elimine o bloco de comentários que contém um elemento <connectionStrings> e cole o seguinte código no seu 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 ficheiro aberto para edição.Leave the file open for editing.

  2. No portal do Azure, clique em Bases de Dados SQL no painel esquerdo, clique na base de dados criada para este tutorial e, em seguida, clique em Mostrar cadeias de ligaçã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 ligação

    O portal apresenta as cadeias de ligação, com um marcador de posição para a palavra-passe.The portal displays connection strings, with a placeholder for the password.

    Cadeias de ligação

  3. No ficheiro de transformação Web.Release.config, elimine {connectionstring} e cole no seu lugar a cadeia de ligação ADO.NET a partir 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 ligação que colou no ficheiro de transformação Web.Release.config, substitua {your_password_here} pela palavra-passe que criou para a nova SQL Database.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. Guarde o ficheiro.Save the file.

  6. Selecione e copie a cadeia de ligação (sem as aspas) para utilização nos passos seguintes 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. No Explorador de Soluções, em Funções no projeto do serviço em nuvem, clique com o botão direito do rato em ContosoAdsWorker e, em seguida, 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 no separador Definições.Click the Settings tab.

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

  10. Selecione o campo Valor para a definição ContosoAdsDbConnectionString e, em seguida, cole a cadeia de ligação que copiou na secçã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 ligação da base de dados para a função de trabalho

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

Configurar a solução para utilizar a conta do Storage do Azure quando for executada no AzureConfigure the solution to use your Azure storage account when it runs in Azure

As cadeias de ligação da conta do Storage do Azure para o projeto da função da Web e para o projeto da função de trabalho são armazenadas nas definições de ambiente no projeto do serviço em 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 definições para serem utilizadas quando a aplicação é executada localmente e quando é executada na cloud.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. Deverá atualizar as definições do ambiente de nuvem para os projetos da função da Web e de trabalho.You'll update the cloud environment settings for both web and worker role projects.

  1. No Explorador de Soluções, clique com o botão direito do rato em ContosoAdsWeb, em Funções no projeto ContosoAdsCloudService, e 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 no separador Definições. Na caixa pendente Configuração do serviço, selecione Nuvem.Click the Settings tab. In the Service Configuration drop-down box, choose Cloud.

    Configuração da nuvem

  3. Selecione a entrada StorageConnectionString, 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 de reticências para abrir a caixa de diálogo Criar Cadeia de Ligação da Conta do Storage.Click the ellipsis button to open the Create Storage Account Connection String dialog box.

    Abrir a caixa Criar cadeia de ligação

  4. Na caixa de diálogo Criar Cadeia de Ligação de Armazenamento, clique em Sua subscrição, selecione a conta do Storage que 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 ainda não tiver sessão iniciada, ser-lhe-ão solicitadas as credenciais da conta do Azure.If you're not already logged in, you'll be prompted for your Azure account credentials.

    Criar Cadeia de Ligação de Armazenamento

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

  6. Siga o mesmo procedimento utilizado para a cadeia de ligação StorageConnectionString para definir a cadeia de ligaçã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.

    Esta cadeia de ligação é utilizada para registo.This connection string is used for logging.

  7. Siga o mesmo procedimento utilizado para a função ContosoAdsWeb para definir ambas as cadeias de ligação para a 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 a Configuração do Serviço para Nuvem.Don't forget to set Service Configuration to Cloud.

As definições do ambiente das funções configuradas utilizando a IU do Visual Studio são armazenadas nos seguintes ficheiros 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 definição.ServiceDefinition.csdef - Defines the setting names.
  • ServiceConfiguration.Cloud.cscfg – fornece valores para quando a aplicação é executada na nuvem.ServiceConfiguration.Cloud.cscfg - Provides values for when the app runs in the cloud.
  • ServiceConfiguration.Cloud.cscfg – fornece valores para quando a aplicação é executada 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 ficheiro ServiceConfiguration.Cloud.cscfg inclui os valores que introduziu para essas definiçõ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 definição <Instances> especifica o número de máquinas virtuais em que 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 secção Passos seguintes inclui ligações para mais informações sobre como ampliar um serviço em nuvem.The Next steps section includes links to more information about scaling out a cloud service,

Implementar o projeto no AzureDeploy the project to Azure

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

    Menu Publicar

  2. No passo Iniciar sessão do assistente Publicar Aplicação Azure, clique em Seguinte.In the Sign in step of the Publish Azure Application wizard, click Next.

    Passo Iniciar sessão

  3. No passo Definições do assistente, clique em Seguinte.In the Settings step of the wizard, click Next.

    Passo Definições

    As predefinições no separador Avançado podem ser utilizadas neste tutorial.The default settings in the Advanced tab are fine for this tutorial. Para obter informações sobre o separador Avançado, consulte Publicar Assistente da Aplicação Azure.For information about the advanced tab, see Publish Azure Application Wizard.

  4. No passo Resumo, clique em Publicar.In the Summary step, click Publish.

    Passo Resumo

    A janela Registo de Atividade do Azure é aberta 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 implementação.Click the right arrow icon to expand the deployment details.

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

    Janela Registo de Atividade do Azure

  6. Quando o estado de implementação estiver concluído, clique no URL da aplicação Web para iniciar a aplicação.When the deployment status is complete, click the Web app URL to start the application.

  7. Pode agora testar a aplicação através da criação, visualização e edição de alguns anúncios, como fez quando executou a aplicação localmente.You can now test the app by creating, viewing, and editing some ads, as you did when you ran the application locally.

Nota

Quando tiver terminado o teste, elimine ou pare o serviço em nuvem.When you're finished testing, delete or stop the cloud service. Mesmo se não estiver a utilizar o serviço em nuvem, este estará a acumular encargos, porque os recursos de máquinas virtuais estão reservados para o mesmo.Even if you're not using the cloud service, it's accruing charges because virtual machine resources are reserved for it. E, se o deixar a funcionar, qualquer pessoa que encontre o URL pode criar e ver anúncios.And if you leave it running, anyone who finds your URL can create and view ads. No portal do Azure, aceda ao separador Descrição Geral do serviço cloud e clique no botão Eliminar 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 pretender impedir temporariamente que outras pessoas acedam ao site, clique em Parar.If you just want to temporarily prevent others from accessing the site, click Stop instead. Nesse caso, os encargos irão continuar a acumular.In that case, charges will continue to accrue. Pode seguir um procedimento semelhante para eliminar a SQL Database e a conta do Storage quando já não necessitar delas.You can follow a similar procedure to delete the SQL database and storage account when you no longer need them.

Criar a aplicação do zeroCreate the application from scratch

Se ainda não transferiu a aplicação concluída, faça-o agora.If you haven't already downloaded the completed application, do that now. Deverá copiar os ficheiros do projeto transferido para o novo projeto.You'll copy files from the downloaded project into the new project.

A criação da aplicação de Anúncios da Contoso envolve os seguintes passos:Creating the Contoso Ads application involves the following steps:

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

Após criar a solução, deverá consultar o código que é exclusivo para os projetos do serviço em nuvem e para os 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 uma solução do Visual Studio do serviço em nuvemCreate a cloud service Visual Studio solution

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

  2. No painel esquerdo da caixa de diálogo Novo Projeto, expanda Visual c# , escolha os modelos Nuvem e, em seguida, escolha o modelo Serviço em 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 clique em OK.Name the project and solution ContosoAdsCloudService, and then click OK.

    Novo Projeto

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

    Novo Projeto do Serviço em Nuvem

  5. Quando vir a caixa de diálogo Novo Projeto ASP.NET para a função da Web, selecione o modelo MVC e 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 Explorador de Soluções, clique com o botão direito do rato na solução (não num dos 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, selecione Windows em Visual c# no painel esquerdo e, em seguida, 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 clique em OK.Name the project ContosoAdsCommon, and then click OK.

    Tem de referenciar o contexto do Entity Framework e o modelo de dados dos projetos da função Web e de trabalho.You need to reference the Entity Framework context and the data model from both web and worker role projects. Como alternativa, pode definir as classes relacionadas a EF no projeto da função da Web e fazer referência a esse projeto no projeto da 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. Mas, na abordagem alternativa, o projeto da função de trabalho terá uma referência a assemblagens Web desnecessária.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 Gerir Pacotes NuGet da 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 estiver na lista, selecione-o e selecione os projetos Web e de trabalho a atualizar e, em seguida, 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 clientes do armazenamento é atualizada com mais frequência do que os modelos do projeto do Visual Studio, por isso, muitas vezes, a versão num projeto criado recentemente precisará 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. Localize o pacote NuGet EntityFramework e instale-o nos três projetos.Find the EntityFramework NuGet package, and install it in all three projects.

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

Definir referências do 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 rato no projeto ContosoAdsWeb e, em seguida, em Referências - Adicionar Referências.Right-click the ContosoAdsWeb project, and then click References - Add References. Na caixa de diálogo Gestor de Referências, selecione Solução – Projetos no painel esquerdo, selecione ContosoAdsCommon e 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 para o projeto ContosoAdsCommon.In the ContosoAdsWorker project, set a reference to the ContosoAdsCommon project.

    O ContosoAdsCommon conterá o modelo de dados e a classe de contexto do Entity Framework, que serão utilizados no 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.

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

Configurar cadeias de ligaçãoConfigure connection strings

Nesta secção, deverá configurar o Armazenamento do Azure e as cadeias de ligação SQL para testar localmente.In this section, you configure Azure Storage and SQL connection strings for testing locally. As instruções de implementação anteriormente descritas no tutorial explicam como configurar as cadeias de ligação para quando a aplicação é executada 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 ficheiro Web.config da aplicação e insira o seguinte elemento connectionStrings 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 estiver a utilizar 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. Guarde as alterações.Save your changes.

  3. No projeto ContosoAdsCloudService, clique com o botão direito do rato em ContosoAdsWeb em Funções e, em seguida, 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, clique em Adicionar configuração.In the ContosoAdsWeb [Role] properties window, click the Settings tab, and then click Add Setting.

    Deixe Configuração do Serviço definida para Todas as Configurações.Leave Service Configuration set to All Configurations.

  5. Adicione uma definição denominada StorageConnectionString.Add a setting named StorageConnectionString. Defina o Tipo para ConnectionString e o Valor para UseDevelopmentStorage = true.Set Type to ConnectionString, and set Value to UseDevelopmentStorage=true.

    Nova cadeia de ligação

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

  7. Siga o mesmo procedimento para adicionar uma cadeia de ligação de armazenamento 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 ContosoAdsWorker [Função] , adicione outra cadeia de ligação:Still in the ContosoAdsWorker [Role] properties window, add another connection string:

    • Nome: ContosoAdsDbConnectionStringName: ContosoAdsDbConnectionString

    • Escreva: 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 seguinte é para o Visual Studio 2013.(The following example is for Visual Studio 2013. Não se esqueça de alterar a Origem de Dados se copiar este exemplo e estiver a utilizar 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 ficheiros de códigoAdd code files

Nesta secção, deverá copiar os ficheiros de código da solução transferida para a solução nova.In this section, you copy code files from the downloaded solution into the new solution. As secções seguintes irão mostrar e explicar as partes principais deste código.The following sections will show and explain key parts of this code.

Para adicionar ficheiros a um projeto ou a uma pasta, clique com o botão direito do rato no projeto ou na pasta e clique 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 ficheiros desejados e clique em Adicionar.Select the files you want and then click Add. Caso lhe seja perguntado se pretende substituir os ficheiros existentes, clique em Sim.If asked whether you want to replace existing files, click Yes.

  1. No projeto ContosoAdsCommon, elimine o ficheiro Class1.cs e adicione no seu lugar os ficheiros Ad.cs e ContosoAdscontext.cs do projeto transferido.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 ficheiros do projeto transferido.In the ContosoAdsWeb project, add the following files from the downloaded project.

    • Global.asax.cs.Global.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 controladores : AdController.cs.In the Controllers folder: AdController.cs.
    • Na pasta Vistas\Anúncio (crie a pasta primeiro): cinco ficheiros .cshtml.In the Views\Ad folder (create the folder first): five .cshtml files.
  3. No projeto ContosoAdsWorker, adicione WorkerRole.cs do projeto transferido.In the ContosoAdsWorker project, add WorkerRole.cs from the downloaded project.

Agora pode compilar e executar a aplicação conforme instruído anteriormente no tutorial. A aplicação utilizará a base de dados local e os recursos do 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 secções seguintes explicam o código relacionado para trabalhar com o ambiente, blobs e filas 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 do MVC e vistas utilizando andaimes, como escrever código do Entity Framework que funcione com bases de dados do SQL Server nem as noções básicas de 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 estes tópicos, consulte os recursos seguintes:For information about these topics, see the following resources:

ContosoAdsCommon – Ad.csContosoAdsCommon - Ad.cs

O ficheiro Ad.cs define uma enumeração de categorias de anúncio e uma classe de entidade POCO para as informações do anúncio.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 Anúncio é utilizada numa coleção DbSet, que o Entity Framework armazenará numa SQL Database.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 tem dois construtores.The class has two constructors. O primeiro é utilizado pelo projeto Web e especifica o nome de uma cadeia de ligação que está armazenada no ficheiro 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-lhe transmitir a cadeia de ligação atual utilizada pelo projeto de função de trabalho, uma vez que não tem um ficheiro 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. Vimos anteriormente onde foi armazenada esta cadeia de ligação e verá posteriormente como o código recupera a cadeia de ligação quando instanciar a 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 pelo método Application_Start cria um contentor de blob de imagens e uma fila de imagens 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. Isto garante que sempre que começar a utilizar uma nova conta do Storage ou começar a utilizar o emulador de armazenamento num novo computador, a fila e contentor de blob 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 do Storage utilizando a cadeia de ligação de armazenamento no ficheiro .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, obtém uma referência para o contentor de blob de imagens, cria o contentor, se ainda não existir, e define as permissões de acesso no novo contentor.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 predefinição, os novos contentores permitem apenas que os clientes com credenciais de conta do Storage acedam aos blobs.By default, new containers only allow clients with storage account credentials to access blobs. O site necessita de blobs para ser público, para poder apresentar imagens com URLs que apontem para os blobs de imagens.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 semelhante 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. Neste caso, não é necessário alterar as permissões.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 ficheiro _Layout.cshtml define o nome da aplicação no cabeçalho e no rodapé e cria uma entrada de menu “Anúncios”.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 ficheiro Views\Home\Index.cshtml apresenta ligações das categorias na página inicial.The Views\Home\Index.cshtml file displays category links on the home page. As ligações passam o valor inteiro da enumeração Category numa variável querystring para a página Índice de Anúncios.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 ficheiro AdController.cs, o construtor chama o método InitializeStorage para criar objetos de Biblioteca de Clientes 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 contentor de blob de imagens, conforme mostrado anteriormente no Global.asax.cs.Then the code gets a reference to the images blob container as you saw earlier in Global.asax.cs. Ao fazer isso, define uma política de repetição predefinida adequada para uma aplicação Web.While doing that it sets a default retry policy appropriate for a web app. A política de repetição de término exponencial predefinida poderá suspender a aplicação Web durante mais de um minuto em tentativas repetidas quando ocorrer um erro transitório.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 repetiçã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");

Um código semelhante 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 utilizando 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 carrega um ficheiro e guarda-o no Blob Storage.An exception is the HttpPost Create method, which uploads a file and saves it in blob storage. A conversão de modelos 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 utilizador tiver selecionado um ficheiro para carregar, o código carrega o ficheiro, guarda-o num blob e atualiza o registo da base de dados do Anúncio com um 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 suporta o carregamento está no método UploadAndSaveBlobAsync.The code that does the upload is in the UploadAndSaveBlobAsync method. Cria um nome de GUID para o blob, carrega e guarda o ficheiro e devolve uma referência para o blob guardado.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 do método HttpPost Create carregar um blob e atualizar a base de dados, cria uma mensagem de fila para informar esse processo de back-end de que uma imagem está pronta para conversão para 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 do método HttpPost Edit é semelhante, à exceção de que se o utilizador selecionar um novo ficheiro de imagem, todos os blobs existentes terão de ser eliminados.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 exemplo seguinte mostra o código que elimina os blobs quando elimina 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 ficheiro Index.cshtml apresenta miniaturas com os outros dados do anúncio.The Index.cshtml file displays thumbnails with the other ad data.

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

O ficheiro Details.cshtml apresenta a imagem de tamanho completo.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 ficheiros Create.cshtml e Edit.cshtml especificam a codificação de formulário que permite que o controlador obtenha 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> indica ao browser para fornecer uma caixa de diálogo de seleção de ficheiros.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 está a iniciar e chama o método Run quando o método OnStart terminar.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 ligação da base de dados no ficheiro .cscfg e passa-a 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 fornecedor SQLClient é utilizado por predefinição, para que o fornecedor não tenha de 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 o contentor de blobs e a fila, caso não existam.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 é semelhante ao que já vimos no método Application_Start da função da Web.The code for that is similar to what you already saw in the web role Application_Start method.

ContosoAdsWorker - WorkerRole.cs - método RunContosoAdsWorker - WorkerRole.cs - Run method

O método Run é chamado quando o método OnStart termina o trabalho de inicialização.The Run method is called when the OnStart method finishes its initialization work. O método executa um ciclo infinito que controla a existência de novas mensagens de fila e processa-as quando chegarem.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 iteração do ciclo, se não for encontrada nenhuma mensagem de fila, o programa permanecerá suspenso durante um segundo.After each iteration of the loop, if no queue message was found, the program sleeps for a second. Isto impede que a função de trabalho incorra em custos excessivos de tempo de CPU e de transações de armazenamento.This prevents the worker role from incurring excessive CPU time and storage transaction costs. A Equipa de Consultadora dos Clientes da Microsoft conta uma história de um programador, que se esqueceu de incluir isto, implementou para produção e partiu para 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.

Por vezes, o conteúdo de uma mensagem de fila causa um erro no processamento.Sometimes the content of a queue message causes an error in processing. Esta mensagem é designada mensagem não processável, e se acabou de registar um erro e reiniciou o ciclo, poderá ter de processar essa mensagem vezes sem conta.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. Por conseguinte, o bloco catch inclui uma instrução Se que verifica o número de ocorrências que a aplicação tentou processar a mensagem atual e, se o número ultrapassar as 5 tentativas, a mensagem é eliminada 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 é encontrada uma mensagem de fila.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);
}

Este código lê a base de dados para obter o URL da imagem, converte a imagem numa miniatura, guarda a miniatura num blob, atualiza a base de dados com o URL do blob de miniaturas e elimina 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.

Nota

O código no método ConvertImageToThumbnailJPG utiliza classes no espaço de nomes System.Drawing por uma questão de simplicidade.The code in the ConvertImageToThumbnailJPG method uses classes in the System.Drawing namespace for simplicity. No entanto, as classes neste espaço de nomes foram concebidas para utilização com o Windows Forms.However, the classes in this namespace were designed for use with Windows Forms. Não são suportadas para utilização num 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 as opções de processamento de imagens, consulte Geração de Imagens Dinâmicas e Redimensionamento de Imagens Profundas.For more information about image-processing options, see Dynamic Image Generation and Deep Inside Image Resizing.

Resolução de problemasTroubleshooting

No caso de algo não funcionar enquanto está a seguir as instruções deste tutorial, apresentamos 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 executa uma aplicação no Azure ou quando é executada localmente utilizando 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 ocorrer este erro quando a aplicação estiver a ser executada localmente, certifique-se de que definiu o projeto ContosoAdsCloudService como o projeto de arranque.If you get this error when you're running locally, make sure that you have set the ContosoAdsCloudService project as the startup project. Isto configura o projeto para ser executado utilizando 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 a aplicação utiliza o RoleEnvironment do Azure é para obter os valores da cadeia de ligação que estão armazenados nos ficheiros .cscfg. Assim, outra causa desta exceção é uma cadeia de ligação em falta.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 definição StorageConnectionString para ambas as configurações Nuvem e Local no projeto ContosoAdsWeb e de que criou ambas as cadeias de ligação para ambas as configurações que criou no 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 toda, deve vê-la 9 vezes nos 6 ficheiros.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 a porta xxx.Cannot override to port xxx. Nova porta abaixo do valor mínimo permitido 8080 para o protocolo httpNew port below minimum allowed value 8080 for protocol http

Experimente alterar o número da porta utilizado pelo projeto Web.Try changing the port number used by the web project. Clique com o botão direito do rato no projeto ContosoAdsWeb e, em seguida, clique em Propriedades.Right-click the ContosoAdsWeb project, and then click Properties. Clique no separador Web e altere o número da porta na definição URL do Projeto.Click the Web tab, and then change the port number in the Project Url setting.

Para obter outra alternativa para resolver o problema, consulte a secção seguinte.For another alternative that might resolve the problem, see the following section.

Outros erros ao executar localmenteOther errors when running locally

Por predefinição, os novos projetos do serviço em nuvem utilizam o emulador de computação do Azure expresso para simular o ambiente do Azure.By default new cloud service projects use the Azure compute emulator express to simulate the Azure environment. Esta é uma versão simples do emulador de computação completo e, em algumas condições, o emulador completo funcionará enquanto a versão expresso não.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 para utilizar o emulador completo, clique com o botão direito do rato no projeto ContosoAdsCloudService e, em seguida, 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 no separador Web e, em seguida, no botão de opção Utilizar Emulador Completo.In the Properties window click the Web tab, and then click the Use Full Emulator radio button.

Para executar a aplicação com o emulador completo, terá de abrir 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.

Passos seguintesNext steps

A aplicação Anúncios da Contoso foi intencionalmente mantida simples para um tutorial de introdução.The Contoso Ads application has intentionally been kept simple for a getting-started tutorial. Por exemplo, não implementa a inserção de dependências nem o repositório e unidade de padrões de trabalho, não utiliza uma interface para registo, não utiliza as Migrações do EF Code First para gerir as alterações dos modelos de dados nem Resiliência da Ligação do EF para gerir erros de rede transitórios e etc.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.

Apresentamos a seguir algumas aplicações de exemplo do serviço em nuvem que demonstram mais práticas de codificação do mundo real, das menos complexas à mais complexas: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 gerais sobre como desenvolver para a nuvem, consulte Compilar Aplicações na Nuvem Reais com o Azure.For general information about developing for the cloud, see Building Real-World Cloud Apps with Azure.

Para obter uma introdução em vídeo aos padrões e melhores práticas do Storage do Azure, consulte Armazenamento do Microsoft Azure – Novidades, 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: