Introduzione a Servizi cloud di Azure e ASP.NETGet started with Azure Cloud Services and ASP.NET

PanoramicaOverview

Questa esercitazione illustra come creare un'applicazione .NET multilivello con un front-end MVC ASP.NET e come distribuirla in un servizio cloud di 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. L'applicazione usa il database SQL di Azure, il servizio BLOB di Azure e il Servizio di accodamento di Azure.The application uses Azure SQL Database, the Azure Blob service, and the Azure Queue service. È possibile scaricare il progetto di Visual Studio da MSDN Code Gallery.You can download the Visual Studio project from the MSDN Code Gallery.

Questa esercitazione illustra come compilare ed eseguire localmente l'applicazione, come distribuirla in Azure ed eseguirla nel cloud e come creare un'applicazione completamente nuova.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. È possibile iniziare creando un'applicazione completamente nuova, quindi eseguire i passaggi relativi a test e distribuzione in un secondo momento, se si preferisce.You can start by building from scratch and then do the test and deploy steps afterward if you prefer.

Applicazione Contoso AdsContoso Ads application

Questa applicazione è un BBS pubblicitario.The application is an advertising bulletin board. Gli utenti creano un'inserzione tramite l'immissione di testo e il caricamento di un'immagine.Users create an ad by entering text and uploading an image. Possono visualizzare un elenco di annunci con immagini di anteprima e visualizzare l'immagine con le dimensioni originali quando selezionano un annuncio per vederne i dettagli.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.

Elenco di inserzioni

L'applicazione usa il modello di lavoro incentrato sulle code per delegare a un processo back-end il lavoro di creazione delle anteprime, che comporta un utilizzo elevato della CPU.The application uses the queue-centric work pattern to off-load the CPU-intensive work of creating thumbnails to a back-end process.

Architettura alternativa: siti Web e processi WebAlternative architecture: Websites and WebJobs

Questa esercitazione mostra come eseguire front-end e back-end in un servizio cloud di Azure.This tutorial shows how to run both front-end and back-end in an Azure cloud service. In alternativa, si può eseguire il front-end in un sito Web di Azure e si può usare la funzionalità Processi Web, attualmente disponibile in anteprima, per il back-end.An alternative is to run the front-end in an Azure website and use the WebJobs feature (currently in preview) for the back-end. Per un'esercitazione che usa Processi Web, vedere Introduzione all'uso dell'SDK di Processi Web di Azure.For a tutorial that uses WebJobs, see Get Started with the Azure WebJobs SDK. Per informazioni su come scegliere i servizi ideali per lo scenario specifico, vedere Confronto tra Siti Web, Servizi cloud e Macchine virtuali di Azure.For information about how to choose the services that best fit your scenario, see Azure Websites, Cloud Services, and virtual machines comparison.

Contenuto dell'esercitazioneWhat you'll learn

  • Abilitare il sistema per lo sviluppo in Azure installando Azure SDK.How to enable your machine for Azure development by installing the Azure SDK.
  • Creare un progetto di servizio cloud di Visual Studio con un ruolo Web MVC ASP.NET e un ruolo di lavoro.How to create a Visual Studio cloud service project with an ASP.NET MVC web role and a worker role.
  • Testare il progetto di servizio cloud localmente, tramite l'emulatore di archiviazione di Azure.How to test the cloud service project locally, using the Azure storage emulator.
  • Pubblicare il progetto cloud in un servizio cloud di Azure e testarlo tramite un account di archiviazione di Azure.How to publish the cloud project to an Azure cloud service and test using an Azure storage account.
  • Caricare file e archiviarli nel servizio BLOB di Azure.How to upload files and store them in the Azure Blob service.
  • Usare il servizio di accodamento di Azure per la comunicazione tra livelli.How to use the Azure Queue service for communication between tiers.

PrerequisitiPrerequisites

Nell'esercitazione si presuppone che l'utente abbia familiarità con i concetti di base relativi ai servizi cloud di Azure, ad esempio con la terminologia ruolo Web e ruolo di lavoro.The tutorial assumes that you understand basic concepts about Azure cloud services such as web role and worker role terminology. Si presuppone anche che si sia in grado di usare progetti MVC ASP.NET o Web Form in Visual Studio.It also assumes that you know how to work with ASP.NET MVC or Web Forms projects in Visual Studio. L'applicazione di esempio usa MVC, ma la maggior parte dell'esercitazione è applicabile anche a Web Form.The sample application uses MVC, but most of the tutorial also applies to Web Forms.

È possibile eseguire l'app localmente senza sottoscrizione di Azure, ma sarà necessaria una sottoscrizione per distribuire l'applicazione nel cloud.You can run the app locally without an Azure subscription, but you'll need one to deploy the application to the cloud. Se non si dispone di un account, è possibile attivare i benefici della sottoscrizione MSDN oppure iscriversi per ottenere una versione di valutazione gratuita.If you don't have an account, you can activate your MSDN subscriber benefits or sign up for a free trial.

Le istruzioni dell'esercitazione sono applicabili ai prodotti seguenti:The tutorial instructions work with either of the following products:

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

Se uno di questi prodotti non è disponibile, Visual Studio potrà essere installato automaticamente quando si installa Azure SDK.If you don't have one of these, Visual Studio may be installed automatically when you install the Azure SDK.

Architettura dell'applicazioneApplication architecture

L'app archivia inserzioni pubblicitarie in un database SQL usando Code First di Entity Framework per creare le tabelle e accedere ai dati.The app stores ads in a SQL database, using Entity Framework Code First to create the tables and access the data. Il database archivia due URL per ogni annuncio, uno per l'immagine con dimensioni normali e uno per l'anteprima.For each ad, the database stores two URLs, one for the full-size image and one for the thumbnail.

Tabella di inserzioni

Quando un utente carica un'immagine, il front-end in esecuzione in un ruolo Web archivia l'immagine in un BLOB di Azure, quindi archivia le informazioni sulle inserzioni nel database con un URL che fa riferimento al 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. e, al tempo stesso, scrive un messaggio in una coda di Azure.At the same time, it writes a message to an Azure queue. Un processo back-end in esecuzione in un ruolo di lavoro esegue periodicamente il polling della coda alla ricerca di nuovi messaggi.A back-end process running in a worker role periodically polls the queue for new messages. Quando compare un nuovo messaggio, il ruolo di lavoro crea un'anteprima per quell'immagine e aggiorna il campo di database relativo all'URL dell'anteprima per quell'inserzione.When a new message appears, the worker role creates a thumbnail for that image and updates the thumbnail URL database field for that ad. Il diagramma seguente mostra l'interazione tra le parti dell'applicazione.The following diagram shows how the parts of the application interact.

Architettura di Contoso Ads

Configurare l'ambiente di sviluppoSet up the development environment

Per iniziare, configurare l'ambiente di sviluppo con Visual Studio e Azure SDK.To start, set up your development environment with Visual Studio and the Azure SDK.

  • Visual Studio 2017 include Azure SDK.Visual Studio 2017 includes the Azure SDK. Se si usa Visual Studio 2017, non è necessario configurare ulteriormente l'ambiente di sviluppo.If you're using VS2017, no additional setup is needed for the development environment.
  • Se si usa Visual Studio 2015, fare clic sul collegamento seguente per installare Azure SDK per Visual Studio 2015.For Visual Studio 2015, click the following link to install the Azure SDK for Visual Studio 2015.
  • Se si usa Visual Studio 2013, fare clic sul collegamento seguente per installare Azure SDK per Visual Studio 2013.For Visual Studio 2013, click the following link to install the Azure SDK for Visual Studio 2013.

  • Se Visual Studio non è installato, fare clic sul collegamento seguente per installare Visual Studio 2017 con Azure SDK.If you don't have Visual Studio installed, use the following to install Visual Studio 2017 with the Azure SDK.

Nota

In base al numero di dipendenze da SDK già presenti nel computer, l'installazione dell'SDK può richiedere tempi lunghi, da alcuni minuti ad almeno mezz'ora.Depending on the number of the SDK dependencies already on your machine, installing the SDK could take a long time, from several minutes to a half hour or more.

Download ed esecuzione della soluzione completataDownload and run the completed solution

  1. Scaricare e decomprimere la soluzione completata.Download and unzip the completed solution.
  2. Avviare Visual Studio.Start Visual Studio.
  3. Scegliere Apri progetto dal menu File, passare alla cartella in cui è stata scaricata la soluzione, quindi aprire il file di soluzione.From the File menu choose Open Project, navigate to where you downloaded the solution, and then open the solution file.
  4. Premere CTRL+MAIUSC+B per compilare la soluzione.Press CTRL+SHIFT+B to build the solution.

    Per impostazione predefinita, Visual Studio ripristina automaticamente il contenuto del pacchetto NuGet, che non era incluso nel file con estensione zip .By default, Visual Studio automatically restores the NuGet package content, which was not included in the .zip file. In caso di mancato ripristino dei pacchetti, installarli manualmente passando alla finestra di dialogo Gestisci pacchetti NuGet per la soluzione, quindi facendo clic sul pulsante Ripristina in alto a destra.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. In Esplora soluzioni verificare che come progetto di avvio sia selezionato ContosoAdsCloudService.In Solution Explorer, make sure that ContosoAdsCloudService is selected as the startup project.
  6. Se si usa Visual Studio 2015 o versione successiva, modificare la stringa di connessione di SQL Server nel file Web.config dell'applicazione per il progetto ContosoAdsWeb e nel file ServiceConfiguration.Local.cscfg per il progetto 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. In ogni caso, cambiare "(localdb)\v11.0" in "(localdb)\MSSQLLocalDB".In each case, change "(localdb)\v11.0" to "(localdb)\MSSQLLocalDB".
  7. Premere CTRL+F5 per eseguire l'applicazione.Press CTRL+F5 to run the application.

    Quando si esegue localmente un progetto di servizio cloud, Visual Studio richiama automaticamente l'emulatore di calcolo di Azure e l'emulatore di archiviazione di Azure.When you run a cloud service project locally, Visual Studio automatically invokes the Azure compute emulator and Azure storage emulator. L'emulatore di calcolo usa le risorse del computer per simulare gli ambienti del ruolo Web e del ruolo di lavoro.The compute emulator uses your computer's resources to simulate the web role and worker role environments. L'emulatore di archiviazione usa un database LocalDB di SQL Server Express per simulare la risorsa di archiviazione cloud di Azure.The storage emulator uses a SQL Server Express LocalDB database to simulate Azure cloud storage.

    Alla prima esecuzione di un progetto di servizio cloud, per l'avvio degli emulatori sarà necessario circa un minuto.The first time you run a cloud service project, it takes a minute or so for the emulators to start up. Dopo l'avvio dell'emulatore, nel browser predefinito verrà visualizzata la home page dell'applicazione.When emulator startup is finished, the default browser opens to the application home page.

    Architettura di Contoso Ads

  8. Fare clic su Create an Ad.Click Create an Ad.
  9. Immettere alcuni dati di test e selezionare un'immagine jpg da caricare, quindi fare clic su Create.Enter some test data and select a .jpg image to upload, and then click Create.

    Pagina di creazione

    L'app passa alla pagina di indice, ma non mostra alcuna anteprima per la nuova inserzione, poiché l'elaborazione non è stata ancora eseguita.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. Attendere un attimo, quindi aggiornare la pagina di indice per visualizzare l'anteprima.Wait a moment and then refresh the Index page to see the thumbnail.

    Pagina di indice

  11. Fare clic su Details per visualizzare l'immagine con dimensioni normali per l'inserzione.Click Details for your ad to see the full-size image.

    Pagina dei dettagli

L'applicazione è stata eseguita interamente nel computer locale, senza connessione al cloud.You've been running the application entirely on your local computer, with no connection to the cloud. L'emulatore di archiviazione archivia i dati di coda e BLOB in un database LocalDB di SQL Server Express e l'applicazione archivia i dati relativi alle inserzioni in un altro database 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. Code First di Entity Framework ha creato automaticamente il database delle inserzioni al primo tentativo di accesso da parte dell'app Web.Entity Framework Code First automatically created the ad database the first time the web app tried to access it.

Nella sezione seguente la soluzione sarà configurata per usare le risorse cloud di Azure per code, BLOB e per il database dell'applicazione in caso di esecuzione nel cloud.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 si vuole, è possibile continuare l'esecuzione locale usando tuttavia le risorse di archiviazione e database del cloud.If you wanted to continue to run locally but use cloud storage and database resources, you could do that. È sufficiente impostare le stringhe di connessione, come sarà illustrato in seguito.It's just a matter of setting connection strings, which you'll see how to do.

Distribuire l'applicazione in AzureDeploy the application to Azure

Per eseguire l'applicazione nel cloud, eseguire i passaggi seguenti:You'll do the following steps to run the application in the cloud:

  • Creare un servizio cloud di Azure.Create an Azure cloud service.
  • Creare un database SQL di Azure.Create an Azure SQL database.
  • Creare un account di archiviazione di AzureCreate an Azure storage account.
  • Configurare la soluzione per l'uso del database SQL di Azure in caso di esecuzione in Azure.Configure the solution to use your Azure SQL database when it runs in Azure.
  • Configurare la soluzione per l'uso dell'account di archiviazione di Azure in caso di esecuzione in Azure.Configure the solution to use your Azure storage account when it runs in Azure.
  • Distribuire il progetto nel servizio cloud di Azure.Deploy the project to your Azure cloud service.

Creazione di un servizio cloud di AzureCreate an Azure cloud service

Un servizio cloud in Azure è l'ambiente in cui sarà eseguita l'applicazione.An Azure cloud service is the environment the application will run in.

  1. Accedere al portale di Azure nel browser.In your browser, open the Azure portal.
  2. Fare clic su Nuovo > Calcolo > Servizio cloud.Click New > Compute > Cloud Service.

  3. Nella casella di input Nome DNS immettere un prefisso URL per il servizio cloud.In the DNS name input box, enter a URL prefix for the cloud service.

    L'URL deve essere univoco.This URL has to be unique. Se il prefisso scelto è già in uso, verrà visualizzato un messaggio di errore.You'll get an error message if the prefix you choose is already in use.

  4. Specificare un nuovo gruppo di risorse per il servizio.Specify a new Resource group for the service. Fare clic su Crea nuovo e quindi digitare un nome nella casella di input Gruppo di risorse, ad esempio CS_contososadsRG.Click Create new and then type a name in the Resource group input box, such as CS_contososadsRG.

  5. Scegliere l'area geografica in cui si vuole distribuire l'applicazione.Choose the region where you want to deploy the application.

    Questo campo specifica in quale data center viene ospitato il servizio cloud.This field specifies which datacenter your cloud service will be hosted in. Per un'applicazione di produzione, scegliere l'area più vicina ai clienti.For a production application, you'd choose the region closest to your customers. Per questa esercitazione, scegliere l'area geografica più vicina alla propria ubicazione.For this tutorial, choose the region closest to you.

  6. Fare clic su Crea.Click Create.

    L'immagine seguente illustra la creazione di un servizio cloud il cui URL è CSvccontosoads.cloudapp.net.In the following image, a cloud service is created with the URL CSvccontosoads.cloudapp.net.

    Nuovo servizio cloud

Creare un database SQL di AzureCreate an Azure SQL database

Quando l'app è in esecuzione nel cloud, userà un database basato sul cloud.When the app runs in the cloud, it will use a cloud-based database.

  1. Nel portale di Azure fare clic su Nuovo > Database > Database SQL.In the Azure portal, click New > Databases > SQL Database.
  2. Nella casella Nome database immettere contosoads.In the Database Name box, enter contosoads.
  3. In Gruppo di risorse fare clic su Usa esistente e selezionare il gruppo di risorse usato per il servizio cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.
  4. Nella schermata illustrata di seguito fare clic su Server - Configurare le impostazioni necessarie e Creare un nuovo server.In the following image, click Server - Configure required settings and Create a new server.

    Tunnel al server di database

    In alternativa, se la sottoscrizione è già associata a un server, sarà possibile selezionare quel server dall'elenco a discesa.Alternatively, if your subscription already has a server, you can select that server from the drop-down list.

  5. Nella casella Nome server immettere csvccontosodbserver.In the Server name box, enter csvccontosodbserver.

  6. Immettere un Nome di accesso e una Password per l'amministratore.Enter an administrator Login Name and Password.

    Se si seleziona Creare un nuovo server non si immetteranno un nome e una password esistenti in questa casella,If you selected Create a new server, you aren't entering an existing name and password here. ma un nuovo nome e una nuova password definiti in questo momento e da usare in seguito per l'accesso al database.You're entering a new name and password that you're defining now to use later when you access the database. Se è stato selezionato un server creato in precedenza, sarà richiesta la password dell'account utente di amministrazione già creato.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. Scegliere la stessa località selezionata per il servizio cloud.Choose the same Location that you chose for the cloud service.

    Quando il servizio cloud e il database si trovano in data center diversi (aree diverse), la latenza aumenterà e sarà addebitato il costo relativo alla larghezza di banda esterna al data center.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. La larghezza di banda nell'ambito di un data center è gratuita.Bandwidth within a data center is free.

  8. Selezionare Consenti ai servizi di Azure di accedere al server.Check Allow azure services to access server.
  9. Fare clic su Seleziona per il nuovo server.Click Select for the new server.

    Nuovo server di database SQL

  10. Fare clic su Crea.Click Create.

Creare un account di archiviazione di AzureCreate an Azure storage account

Un account di archiviazione di Azure offre risorse per l'archiviazione di dati di code e BLOB nel cloud.An Azure storage account provides resources for storing queue and blob data in the cloud.

In un'applicazione effettiva si creano in genere account separati per i dati dell'applicazione rispetto ai dati di registrazione e account separati per i dati di test rispetto ai dati di produzione.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. In questa esercitazione sarà usato un solo account.For this tutorial, you'll use just one account.

  1. Nel portale di Azure fare clic su Nuovo > Archiviazione > Account di archiviazione: BLOB, File, Tabelle, Code.In the Azure portal, click New > Storage > Storage account - blob, file, table, queue.
  2. Nella casella Nome immettere un prefisso URL.In the Name box, enter a URL prefix.

    La combinazione di questo prefisso e del testo visualizzato sotto la casella corrisponderà all'URL univoco dell'account di archiviazione.This prefix plus the text you see under the box will be the unique URL to your storage account. Se il prefisso immesso è già stato usato, sarà necessario scegliere un prefisso diverso.If the prefix you enter has already been used by someone else, you'll have to choose a different prefix.

  3. Impostare Modello di distribuzione su Classica.Set the Deployment model to Classic.

  4. Nell'elenco a discesa Replica scegliere Archiviazione con ridondanza locale.Set the Replication drop-down list to Locally redundant storage.

    Quando per un account di archiviazione è abilitata la replica geografica, il contenuto archiviato viene replicato in un data center secondario per permettere il failover in caso di emergenza grave nella posizione primaria.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. La replica geografica può comportare costi aggiuntivi.Geo-replication can incur additional costs. Per gli account di test e di sviluppo si preferisce in genere non pagare per la replica geografica.For test and development accounts, you generally don't want to pay for geo-replication. Per altre informazioni, vedere la pagina relativa alla creazione, gestione o eliminazione di un account di archiviazione.For more information, see Create, manage, or delete a storage account.

  5. In Gruppo di risorse fare clic su Usa esistente e selezionare il gruppo di risorse usato per il servizio cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.

  6. Scegliere dall'elenco a discesa Località la stessa area geografica selezionata per il servizio cloud.Set the Location drop-down list to the same region you chose for the cloud service.

    Quando il servizio cloud e l'account di archiviazione si trovano in data center diversi (aree diverse), la latenza aumenterà e verrà addebitato il costo relativo alla larghezza di banda esterna al 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. La larghezza di banda nell'ambito di un data center è gratuita.Bandwidth within a data center is free.

    I gruppi di affinità di Azure offrono un meccanismo per ridurre la distanza tra le risorse in un data center e di conseguenza la latenza.Azure affinity groups provide a mechanism to minimize the distance between resources in a data center, which can reduce latency. In questa esercitazione non vengono utilizzati gruppi di affinità.This tutorial does not use affinity groups. Per altre informazioni, vedere Come creare un gruppo di affinità in Azure.For more information, see How to Create an Affinity Group in Azure.

  7. Fare clic su Crea.Click Create.

    Nuovo account di archiviazione

    La seguente figura illustra la creazione di un account di archiviazione con l'URL csvccontosoads.core.windows.net.In the image, a storage account is created with the URL csvccontosoads.core.windows.net.

Configurare la soluzione per l'uso del database SQL di Azure in caso di esecuzione in AzureConfigure the solution to use your Azure SQL database when it runs in Azure

Il progetto Web e il progetto ruolo di lavoro dispongono di una stringa di connessione di database specifica e quando l'app è in esecuzione in Azure ogni progetto deve fare riferimento al database SQL di 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.

Sarà necessario usare una trasformazione Web.config per il ruolo Web e un'impostazione dell'ambiente del servizio cloud per il ruolo di lavoro.You'll use a Web.config transform for the web role and a cloud service environment setting for the worker role.

Nota

In questa sezione e nella sezione successiva, le credenziali vengono archiviate in file di progetto.In this section and the next section, you store credentials in project files. Non archiviare dati sensibili in archivi pubblici di codice sorgente.Don't store sensitive data in public source code repositories.

  1. Nel progetto ContosoAdsWeb aprire il file di trasformazione Web.Release.config per il file Web.config dell'applicazione, eliminare il blocco di commento che include un elemento <connectionStrings> e sostituirlo incollando il codice seguente.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>
    

    Lasciare aperto il file per la modifica.Leave the file open for editing.

  2. Nel portale di Azure fare clic su Database SQL nel riquadro sinistro, selezionare il database creato per l'esercitazione, quindi fare clic su Mostra stringhe di connessione.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.

    Mostra stringhe di connessione

    Il portale visualizza le stringhe di connessione, con un segnaposto per la password.The portal displays connection strings, with a placeholder for the password.

    Stringhe di connessione

  3. Nel file di trasformazione Web.Release.config eliminare {connectionstring} e incollare al suo posto la stringa di connessione ADO.NET dal portale di 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. Nella stringa di connessione incollata nel file di trasformazione Web.Release.config sostituire {your_password_here} con la password creata per il nuovo database 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. Salvare il file.Save the file.
  6. Selezionare e copiare la stringa di connessione, senza le virgolette tra cui è racchiusa, per usarla nei passaggi seguenti per la configurazione del progetto di ruolo di lavoro.Select and copy the connection string (without the surrounding quotation marks) for use in the following steps for configuring the worker role project.
  7. In Esplora soluzioni, in Ruoli nel progetto di servizio cloud fare clic con il pulsante destro del mouse su ContosoAdsWorker, quindi scegliere Proprietà.In Solution Explorer, under Roles in the cloud service project, right-click ContosoAdsWorker and then click Properties.

    Proprietà del ruolo

  8. Fare clic sulla scheda Impostazioni .Click the Settings tab.
  9. Impostare Configurazione servizio su Cloud.Change Service Configuration to Cloud.
  10. Selezionare il campo Valore per l'impostazione ContosoAdsDbConnectionString e quindi incollare la stringa di connessione copiata dalla sezione precedente dell'esercitazione.Select the Value field for the ContosoAdsDbConnectionString setting, and then paste the connection string that you copied from the previous section of the tutorial.

    Stringa di connessione del database per il ruolo di lavoro

  11. Salvare le modifiche.Save your changes.

Configurare la soluzione per l'uso dell'account di archiviazione di Azure in caso di esecuzione in AzureConfigure the solution to use your Azure storage account when it runs in Azure

Le stringhe di connessione per l'account di archiviazione di Azure per il progetto ruolo Web e il progetto ruolo di lavoro sono archiviate nelle impostazioni di ambiente nel progetto di servizio cloud.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. Per ogni progetto è disponibile un insieme di impostazioni distinto da usare quando l'applicazione viene eseguita localmente e nel 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. Saranno aggiornate le impostazioni di ambiente cloud per i progetti di ruolo Web e di ruolo di lavoro.You'll update the cloud environment settings for both web and worker role projects.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su ContosoAdsWeb nella sezione Ruoli del progetto ContosoAdsCloudService, quindi scegliere Proprietà.In Solution Explorer, right-click ContosoAdsWeb under Roles in the ContosoAdsCloudService project, and then click Properties.

    Proprietà del ruolo

  2. Fare clic sulla scheda Impostazioni . Nella casella di riepilogo Configurazione servizio selezionare Cloud.Click the Settings tab. In the Service Configuration drop-down box, choose Cloud.

    Configurazione del cloud

  3. Se si seleziona la voce StorageConnectionString, verrà visualizzato un pulsante con puntini di sospensione (...) all'estremità destra della riga.Select the StorageConnectionString entry, and you'll see an ellipsis (...) button at the right end of the line. Fare clic su tale pulsante per aprire la finestra di dialogo Crea Stringa di connessione all'account di archiviazione .Click the ellipsis button to open the Create Storage Account Connection String dialog box.

    Casella di creazione della stringa di connessione

  4. Nella finestra di dialogo Crea stringa di connessione a risorsa di archiviazione fare clic su Sottoscrizione scegliere l'account di archiviazione creato in precedenza, quindi fare clic su 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 non è già stato effettuato l'accesso, saranno richieste le credenziali dell'account di Azure.If you're not already logged in, you'll be prompted for your Azure account credentials.

    Crea Stringa di connessione di archiviazione

  5. Salvare le modifiche.Save your changes.
  6. Eseguire la stessa procedura usata per la stringa di connessione StorageConnectionString per impostare la stringa di connessione 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.

    Questa stringa di connessione è usata per la registrazione.This connection string is used for logging.

  7. Eseguire la stessa procedura usata per il ruolo ContosoAdsWeb per impostare entrambe le stringhe di connessione per il ruolo ContosoAdsWorker.Follow the same procedure that you used for the ContosoAdsWeb role to set both connection strings for the ContosoAdsWorker role. Ricordarsi di impostare Configurazione servizio su Cloud.Don't forget to set Service Configuration to Cloud.

Le impostazioni dell'ambiente di ruolo configurate tramite l'interfaccia utente di Visual Studio sono archiviate nei seguenti file del progetto 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 : definisce i nomi delle impostazioni.ServiceDefinition.csdef - Defines the setting names.
  • ServiceConfiguration.Cloud.cscfg : fornisce valori per l'esecuzione dell'app nel cloud.ServiceConfiguration.Cloud.cscfg - Provides values for when the app runs in the cloud.
  • ServiceConfiguration.Local.cscfg : fornisce valori per l'esecuzione locale dell'app.ServiceConfiguration.Local.cscfg - Provides values for when the app runs locally.

Il file ServiceDefinition.csdef include ad esempio le definizioni seguenti:For example, the ServiceDefinition.csdef includes the following definitions:

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

E il file ServiceConfiguration.Cloud.cscfg include i valori immessi per queste impostazioni in 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>

L'impostazione <Instances> specifica il numero di macchine virtuali in cui Azure eseguirà il codice del ruolo di lavoro.The <Instances> setting specifies the number of virtual machines that Azure will run the worker role code on. La sezione Passaggi successivi include collegamenti ad altre informazioni sulla scalabilità orizzontale di un servizio cloud,The Next steps section includes links to more information about scaling out a cloud service,

Distribuire il progetto in AzureDeploy the project to Azure

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto cloud ContosoAdsCloudService, quindi scegliere Pubblica.In Solution Explorer, right-click the ContosoAdsCloudService cloud project and then select Publish.

    Menu Pubblica

  2. Nel passaggio Accedi della procedura guidata Pubblica applicazione Azure fare clic su Avanti.In the Sign in step of the Publish Azure Application wizard, click Next.

    Passaggio Accedi

  3. Nel passaggio Impostazioni della procedura guidata, fare clic su Avanti.In the Settings step of the wizard, click Next.

    Passaggio Impostazioni

    Le impostazioni predefinite della scheda Advanced sono corrette per questa esercitazione.The default settings in the Advanced tab are fine for this tutorial. Per informazioni sulla scheda Avanzate, vedere Procedura guidata Pubblica l'applicazione Azure.For information about the advanced tab, see Publish Azure Application Wizard.

  4. Nel passaggio Riepilogo fare clic su Pubblica.In the Summary step, click Publish.

    Passaggio Riepilogo

    La finestra Log attività di Azure sarà aperta in Visual Studio.The Azure Activity Log window opens in Visual Studio.

  5. Fare clic sull'icona della freccia verso destra per espandere i dettagli della distribuzione.Click the right arrow icon to expand the deployment details.

    Il completamento della distribuzione richiede fino a 5 minuti.The deployment can take up to 5 minutes or more to complete.

    Finestra Log attività di Azure

  6. Quando lo stato della distribuzione è completato, fare clic sull' URL dell'app Web per avviare l'applicazione.When the deployment status is complete, click the Web app URL to start the application.
  7. È ora possibile testare l'applicazione creando, visualizzando e modificando alcune inserzioni, esattamente come durante l'esecuzione locale dell'applicazione.You can now test the app by creating, viewing, and editing some ads, as you did when you ran the application locally.

Nota

Al termine dei test, eliminare o arrestare il servizio cloud.When you're finished testing, delete or stop the cloud service. Anche se non lo si usa, il servizio cloud accumulerà addebiti, poiché le risorse delle macchine virtuali sono riservate per il servizio.Even if you're not using the cloud service, it's accruing charges because virtual machine resources are reserved for it. Se lo si lascia in esecuzione, chiunque individui l'URL potrà creare e visualizzare inserzioni.And if you leave it running, anyone who finds your URL can create and view ads. Nel portale di Azure passare alla scheda Panoramica per il servizio cloud, quindi fare clic sul pulsante Elimina nella parte superiore della pagina.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 si vuole semplicemente impedire ad altri utenti di accedere al sito, fare invece clic su Arresta .If you just want to temporarily prevent others from accessing the site, click Stop instead. In questo caso, continueranno a essere generati addebiti.In that case, charges will continue to accrue. È possibile eseguire una procedura analoga per eliminare il database SQL e l'account di archiviazione quando non sono più necessari.You can follow a similar procedure to delete the SQL database and storage account when you no longer need them.

Creazione di un'applicazione completamente nuovaCreate the application from scratch

Se non è stata ancora scaricata l' applicazione completa, scaricarla ora.If you haven't already downloaded the completed application, do that now. I file del progetto scaricato saranno copiati nel nuovo progetto.You'll copy files from the downloaded project into the new project.

Per creare l'applicazione Contoso Ads sono necessari i passaggi seguenti:Creating the Contoso Ads application involves the following steps:

  • Creare una soluzione servizio cloud di Visual Studio.Create a cloud service Visual Studio solution.
  • Aggiornare e aggiungere pacchetti NuGet.Update and add NuGet packages.
  • Impostare i riferimenti al progetto.Set project references.
  • Configurare le stringhe di connessione.Configure connection strings.
  • Aggiungere file di codice.Add code files.

Dopo la creazione della soluzione, esaminare il codice univoco per i progetti di servizio cloud e per i BLOB e le code di Azure.After the solution is created, you'll review the code that is unique to cloud service projects and Azure blobs and queues.

Creare una soluzione servizio cloud di Visual StudioCreate a cloud service Visual Studio solution

  1. In Visual Studio scegliere Nuovo progetto from the File .In Visual Studio, choose New Project from the File menu.
  2. Nel riquadro sinistro della finestra di dialogo Nuovo progetto espandere Visual C#, scegliere i modelli Cloud, quindi selezionare il modello Servizio cloud di 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. Assegnare al progetto e alla soluzione il nome ContosoAdsCloudService, quindi fare clic su OK.Name the project and solution ContosoAdsCloudService, and then click OK.

    Nuovo progetto

  4. Nella finestra di dialogo Nuovo servizio cloud Azure aggiungere un ruolo Web e un ruolo di lavoro.In the New Azure Cloud Service dialog box, add a web role and a worker role. Assegnare il nome ContosoAdsWeb al ruolo Web e il nome ContosoAdsWorker al ruolo di lavoro.Name the web role ContosoAdsWeb, and name the worker role ContosoAdsWorker. Usare l'icona a forma di matita nel riquadro di destra per modificare i nomi predefiniti dei ruoli.(Use the pencil icon in the right-hand pane to change the default names of the roles.)

    Nuovo progetto di servizio cloud

  5. Quando appare la finestra di dialogo Nuovo progetto ASP.NET per il ruolo Web, scegliere il modello MVC, quindi fare clic su Modifica autenticazione.When you see the New ASP.NET Project dialog box for the web role, choose the MVC template, and then click Change Authentication.

    Modifica autenticazione

  6. Nella finestra di dialogo Modifica autenticazione fare clic su Nessuna autenticazione, quindi fare clic su OK.In the Change Authentication dialog box, choose No Authentication, and then click OK.

    No Authentication

  7. Nella finestra di dialogo Nuovo progetto ASP.NET fare clic su OK.In the New ASP.NET Project dialog, click OK.
  8. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione, non su uno dei progetti, quindi scegliere Aggiungi - Nuovo progetto.In Solution Explorer, right-click the solution (not one of the projects), and choose Add - New Project.
  9. Nella finestra di dialogo Aggiungi nuovo progetto scegliere Windows in Visual C# nel riquadro sinistro e quindi fare clic sul modello Libreria di classi.In the Add New Project dialog box, choose Windows under Visual C# in the left pane, and then click the Class Library template.
  10. Assegnare il nome ContosoAdsCommonal progetto, quindi fare clic su OK.Name the project ContosoAdsCommon, and then click OK.

    È necessario che i progetti di ruolo Web e di ruolo di lavoro facciano riferimento al contesto e al modello di dati di Entity Framework.You need to reference the Entity Framework context and the data model from both web and worker role projects. In alternativa, è possibile definire le classi correlate a Entity Framework nel progetto di ruolo Web e fare riferimento a tale progetto dal progetto di ruolo di lavoro.As an alternative, you could define the EF-related classes in the web role project and reference that project from the worker role project. Nell'approccio alternativo, tuttavia, il progetto di ruolo di lavoro includerebbe un riferimento ad assembly Web non necessari.But in the alternative approach, your worker role project would have a reference to web assemblies that it doesn't need.

Aggiornare e aggiungere pacchetti NuGetUpdate and add NuGet packages

  1. Aprire la finestra di dialogo Gestisci pacchetti NuGet per la soluzione.Open the Manage NuGet Packages dialog box for the solution.
  2. Nella parte superiore della finestra selezionare Aggiornamenti.At the top of the window, select Updates.
  3. Cercare il pacchetto WindowsAzure.Storage. Se è incluso nell'elenco, selezionarlo e selezionare i progetti Web e di lavoro in cui aggiornarlo e quindi fare clic su Aggiorna.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.

    La libreria del client di archiviazione viene aggiornata con frequenza maggiore rispetto ai modelli di progetto di Visual Studio. È quindi possibile che la versione disponibile in un progetto appena creato debba essere aggiornata.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. Nella parte superiore della finestra selezionare Sfoglia.At the top of the window, select Browse.
  5. Individuare il pacchetto NuGet EntityFramework e installarlo nei tre progetti.Find the EntityFramework NuGet package, and install it in all three projects.
  6. Trovare il pacchetto NuGet Microsoft.WindowsAzure.ConfigurationManager e installarlo nel progetto del ruolo di lavoro.Find the Microsoft.WindowsAzure.ConfigurationManager NuGet package, and install it in the worker role project.

Configurare le preferenze del progettoSet project references

  1. Nel progetto ContosoAdsWeb configurare un riferimento al progetto ContosoAdsCommon.In the ContosoAdsWeb project, set a reference to the ContosoAdsCommon project. Fare clic con il pulsante destro del mouse sul progetto ContosoAdsWeb, quindi scegliere Riferimenti - Aggiungi riferimenti.Right-click the ContosoAdsWeb project, and then click References - Add References. Nella finestra di dialogo Gestione riferimenti selezionare Soluzione - Progetti nel riquadro di sinistra, selezionare ContosoAdsCommon, quindi fare clic su OK.In the Reference Manager dialog box, select Solution – Projects in the left pane, select ContosoAdsCommon, and then click OK.
  2. Nel progetto ContosoAdsWorker configurare un riferimento al progetto ContosoAdsCommon.In the ContosoAdsWorker project, set a reference to the ContosAdsCommon project.

    ContosoAdsCommon includerà il modello di dati e la classe contesto di Entity Framework, che saranno usati dal front-end e dal 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. Nel progetto ContosoAdsWorker configurare un riferimento a System.Drawing.In the ContosoAdsWorker project, set a reference to System.Drawing.

    Questo assembly è usato dal back-end per convertire le immagini in anteprime.This assembly is used by the back-end to convert images to thumbnails.

Configurare le stringhe di connessioneConfigure connection strings

In questa sezione verranno configurate le stringhe di connessione di Archiviazione di Azure e SQL per il test in locale.In this section, you configure Azure Storage and SQL connection strings for testing locally. Le istruzioni di distribuzione disponibili in precedenza in questa esercitazione illustrano come configurare le stringhe di connessione per l'esecuzione dell'app nel cloud.The deployment instructions earlier in the tutorial explain how to set up the connection strings for when the app runs in the cloud.

  1. Nel progetto ContosoAdsWeb aprire il file Web.config dell'applicazione e inserire il seguente elemento connectionStrings dopo l'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 si usa Visual Studio 2015 o versione successiva, sostituire "v11.0" con "MSSQLLocalDB".If you're using Visual Studio 2015 or higher, replace "v11.0" with "MSSQLLocalDB".

  2. Salvare le modifiche.Save your changes.
  3. Nel progetto ContosoAdsCloudService fare clic con il pulsante destro del mouse su ContosoAdsWeb in Ruoli, quindi scegliere Proprietà.In the ContosoAdsCloudService project, right-click ContosoAdsWeb under Roles, and then click Properties.

    Proprietà del ruolo

  4. Nella finestra delle proprietà di ContosAdsWeb [Role] fare clic sulla scheda Impostazioni, quindi su Aggiungi impostazione.In the ContosAdsWeb [Role] properties window, click the Settings tab, and then click Add Setting.

    Lasciare l'opzione Configurazione servizio impostata su Tutte le configurazioni.Leave Service Configuration set to All Configurations.

  5. Aggiungere un'impostazione denominata StorageConnectionString.Add a setting named StorageConnectionString. Impostare il Tipo su ConnectionString, quindi impostare il Valore su UseDevelopmentStorage=true.Set Type to ConnectionString, and set Value to UseDevelopmentStorage=true.

    Nuova stringa di connessione

  6. Salvare le modifiche.Save your changes.
  7. Eseguire la stessa procedura per aggiungere una stringa di connessione di archiviazione nelle proprietà del ruolo ContosoAdsWorker.Follow the same procedure to add a storage connection string in the ContosoAdsWorker role properties.
  8. Nella finestra delle proprietà di ContosoAdsWorker [Ruolo] aggiungere un'altra stringa di connessione:Still in the ContosoAdsWorker [Role] properties window, add another connection string:

    • Nome: ContosoAdsDbConnectionStringName: ContosoAdsDbConnectionString
    • Tipo: StringType: String
    • Valore: incollare la stessa stringa di connessione usata per il progetto di ruolo Web.Value: Paste the same connection string you used for the web role project. L'esempio seguente si riferisce a Visual Studio 2013,(The following example is for Visual Studio 2013. quindi se si copia questo esempio e si usa Visual Studio 2015 o versione successiva è necessario modificare l'origine dati.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;
      

Aggiungere file di codiceAdd code files

In questa sezione, i file di codice saranno copiati dalla soluzione scaricata alla nuova soluzione.In this section, you copy code files from the downloaded solution into the new solution. Le sezioni seguenti illustrano e spiegano parti chiave del codice.The following sections will show and explain key parts of this code.

Per aggiungere file a un progetto o a una cartella, fare clic con il pulsante destro del mouse sul progetto o sulla cartella, quindi scegliere Aggiungi - Elemento esistente.To add files to a project or a folder, right-click the project or folder and click Add - Existing Item. Selezionare i file da aggiungere, quindi fare clic su Aggiungi.Select the files you want and then click Add. Se viene richiesto di confermare che si vogliono sostituire i file esistenti, fare clic su .If asked whether you want to replace existing files, click Yes.

  1. Nel progetto ContosoAdsCommon eliminare il file Class1.cs e sostituirlo con i file Ad.cs e ContosoAdscontext.cs dal progetto scaricato.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. Nel progetto ContosoAdsWeb aggiungere i file seguenti dal progetto scaricato.In the ContosoAdsWeb project, add the following files from the downloaded project.

    • Global.asax.cs.Global.asax.cs.
    • Nella cartella Views\Shared: _Layout.cshtml.In the Views\Shared folder: _Layout.cshtml.
    • Nella cartella Views\Home: Index.cshtml.In the Views\Home folder: Index.cshtml.
    • Nella cartella Controllers: AdController.cs.In the Controllers folder: AdController.cs.
    • Nella cartella Views\Ad (creare prima di tutto la cartella): cinque file .cshtml.In the Views\Ad folder (create the folder first): five .cshtml files.
  3. Nel progetto ContosoAdsWorker aggiungere il file WorkerRole.cs dal progetto scaricato.In the ContosoAdsWorker project, add WorkerRole.cs from the downloaded project.

È ora possibile compilare ed eseguire l'applicazione come indicato in precedenza nell'organizzazione e l'app userà le risorse locali del database e dell'emulatore di archiviazione.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.

Le sezioni seguenti illustrano il codice correlato all'uso dell'ambiente, dei BLOB e delle code di Azure.The following sections explain the code related to working with the Azure environment, blobs, and queues. Questa esercitazione non spiega come creare controlli e visualizzazioni MVC usando lo scaffolding, come scrivere codice di Entity Framework da usare con database SQL Server oppure le nozioni di base della programmazione asincrona in 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. Per informazioni su questi argomenti, vedere le risorse seguenti:For information about these topics, see the following resources:

ContosoAdsCommon - Ad.csContosoAdsCommon - Ad.cs

Il file Ad.cs definisce un'enumerazione per le categorie di inserzione e una classe di entità POCO per le informazioni sulle inserzioni.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

La classe ContosoAdsContext specifica che la classe Ad è usata in una raccolta DbSet, che sarà archiviata da Entity Framework in un database 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; }
}

La classe ha due costruttori.The class has two constructors. Il primo è usato dal progetto Web e specifica il nome di una stringa di connessione archiviata nel file 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. Il secondo costruttore permette di passare la stringa di connessione effettiva usata dal progetto di ruolo di lavoro, non avendo questo un file Web.config.The second constructor enables you to pass in the actual connection string used by the worker role project, since it doesn't have a Web.config file. In precedenza è stato indicato il percorso di archiviazione di questa stringa di connessione e più avanti sarà illustrato il modo in cui il codice recupera la stringa di connessione durante la creazione di istanze della 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

Il codice chiamato dal metodo Application_Start crea un contenitore BLOB images e una coda images, se non esistono già.Code that is called from the Application_Start method creates an images blob container and an images queue if they don't already exist. In questo modo, ogni volta che si inizia a usare un nuovo account di archiviazione o a usare l'emulatore di archiviazione in un nuovo computer, il contenitore BLOB e la coda necessari saranno creati 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.

Il codice ottiene l'accesso all'account di archiviazione tramite la stringa di connessione del file .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"));

Ottiene quindi un riferimento al contenitore BLOB images , crea il contenitore se non esiste già e configura le autorizzazioni di accesso nel nuovo contenitore.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. Per impostazione predefinita, i nuovi contenitori permettono l'accesso ai BLOB solo ai client con credenziali dell'account di archiviazione.By default, new containers only allow clients with storage account credentials to access blobs. Per il sito Web è necessario che i BLOB siano pubblici, in modo che sia possibile visualizzare immagini usando gli URL che fanno riferimento ai BLOB delle immagini.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
        });
}

Tramite codice analogo si ottiene un riferimento alla coda images e si crea una nuova coda.Similar code gets a reference to the images queue and creates a new queue. In questo caso non sono necessarie modifiche alle autorizzazioni.In this case, no permissions change is needed.

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

ContosoAdsWeb - _Layout.cshtmlContosoAdsWeb - _Layout.cshtml

Il file _Layout.cshtml imposta il nome dell'app nell'intestazione e nel piè di pagina e crea una voce di menu "Ads" (Annunci).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

Il file Views\Home\Index.cshtml visualizza i collegamenti di categoria nella home page.The Views\Home\Index.cshtml file displays category links on the home page. I collegamenti passano il valore Integer dell'enumerazione Category in una variabile querystring alla pagina Ads Index.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

Nel file AdController.cs il costruttore chiama il metodo InitializeStorage per creare oggetti della libreria del client di Archiviazione di Azure che forniscono un'API per l'uso di BLOB e code.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.

Il codice ottiene quindi un riferimento al contenitore BLOB images, come illustrato in precedenza in Global.asax.cs.Then the code gets a reference to the images blob container as you saw earlier in Global.asax.cs. Durante questa operazione, imposta un criterio per l'esecuzione di nuovi tentativi predefinito appropriato per un'app Web.While doing that it sets a default retry policy appropriate for a web app. Il criterio per l'esecuzione di nuovi tentativi predefinito per il backoff esponenziale potrebbe sospendere l'app Web per più di un minuto in caso di nuovi tentativi ripetuti per un errore temporaneo.The default exponential backoff retry policy could hang the web app for longer than a minute on repeated retries for a transient fault. Il criterio di ripetizione dei tentativi specificato qui attende tre secondi dopo ogni tentativo, fino a un massimo di tre tentativi.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");

Tramite codice analogo si ottiene un riferimento alla coda images .Similar code gets a reference to the images queue.

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

La maggior parte del codice del controller è tipica per l'uso di un modello di dati Entity Framework con una classe DbContext.Most of the controller code is typical for working with an Entity Framework data model using a DbContext class. Un'eccezione è costituita dal metodo Create HttpPost che carica un file e lo salva nell'archiviazione BLOB.An exception is the HttpPost Create method, which uploads a file and saves it in blob storage. Lo strumento di associazione di modelli fornisce un oggetto HttpPostedFileBase al metodo.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 l'utente ha selezionato un file da caricare, il codice carica il file, lo salva in un BLOB e aggiorna il record del database Ad con un URL che fa riferimento al 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();
}

Il codice che esegue il caricamento si trova nel metodo UploadAndSaveBlobAsync .The code that does the upload is in the UploadAndSaveBlobAsync method. Crea un nome GUID per il BLOB, aggiorna e salva il file, quindi restituisce un riferimento al BLOB salvato.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;
}

Dopo aver caricato un BLOB e aggiornato il database, il metodo Create HttpPost crea un messaggio di coda per segnalare al processo back-end che un'immagine è pronta per la conversione in anteprima.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);

Il codice per il metodo Edit HttpPost è simile, con la differenza che se l'utente seleziona un nuovo file immagine, sarà necessario eliminare eventuali BLOB già esistenti.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();
}

L’esempio successivo riporta il codice per l'eliminazione dei BLOB in caso di eliminazione di un'inserzione.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

Il file Index.cshtml mostra le anteprime insieme agli altri dati delle inserzioni.The Index.cshtml file displays thumbnails with the other ad data.

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

Il file Details.cshtml mostra l'immagine con dimensioni normali.The Details.cshtml file displays the full-size image.

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

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

I file Create.cshtml e Edit.cshtml specificano la codifica di moduli che permette al controller di ottenere l'oggetto 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" }))

Un elemento <input> segnala al browser che è necessario fornire una finestra di selezione del file.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 - Metodo OnStartContosoAdsWorker - WorkerRole.cs - OnStart method

L'ambiente del ruolo di lavoro di Azure chiama il metodo OnStart nella classe WorkerRole durante la fase di avvio del ruolo di lavoro e chiama il metodo Run al termine dell'esecuzione del metodo OnStart.The Azure worker role environment calls the OnStart method in the WorkerRole class when the worker role is getting started, and it calls the Run method when the OnStart method finishes.

Il metodo OnStart ottiene la stringa di connessione del database dal file con estensione cscfg e la passa alla classe DbContext di Entity Framework.The OnStart method gets the database connection string from the .cscfg file and passes it to the Entity Framework DbContext class. Per impostazione predefinita, sarà usato il provider SQLClient. Non è quindi necessario specificare alcun provider.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);

In seguito, il metodo ottiene un riferimento all'account di archiviazione e crea il contenitore BLOB e la coda, se non esistono già.After that, the method gets a reference to the storage account and creates the blob container and queue if they don't exist. Il codice da usare è simile a quello già usato per il metodo Application_Start del ruolo Web.The code for that is similar to what you already saw in the web role Application_Start method.

ContosoAdsWorker - WorkerRole.cs - Metodo RunContosoAdsWorker - WorkerRole.cs - Run method

Il metodo Run è chiamato al termine del processo di inizializzazione del metodo OnStart.The Run method is called when the OnStart method finishes its initialization work. Il metodo esegue un ciclo infinito che cerca nuovi messaggi di coda e li elabora quando arrivano.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);
        }
    }
}

Dopo ogni iterazione del ciclo, se non sono stati trovati messaggi di coda, il programma rimane inattivo per un secondo.After each iteration of the loop, if no queue message was found, the program sleeps for a second. Ciò impedisce al ruolo di lavoro di generare costi eccessivi relativi al tempo della CPU e alle transazioni di archiviazione.This prevents the worker role from incurring excessive CPU time and storage transaction costs. Come ricordato da Microsoft Customer Advisory Team, uno sviluppatore aveva scordato di includere questo dettaglio, aveva eseguito la distribuzione in produzione ed era partito per le ferie.The Microsoft Customer Advisory Team tells a story about a developer who forgot to include this, deployed to production, and left for vacation. Al ritorno, si era reso conto che la dimenticanza era costata più cara delle ferie.When he got back, his oversight cost more than the vacation.

A volte il contenuto di un messaggio di coda provoca un errore di elaborazione.Sometimes the content of a queue message causes an error in processing. Questo messaggio è definito un messaggio non elaborabile. Se è stato appena registrato un errore e il ciclo è stato riavviato, è possibile che si tenti di elaborare questo messaggio all'infinito.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. Il blocco CATCH include quindi un'istruzione IF che verifica il numero di volte in cui l'app ha tentato di elaborare il messaggio corrente. Se il numero è superiore a 5, il messaggio sarà eliminato dalla coda.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 è chiamato quando viene trovato un messaggio della coda.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);
}

Questo codice legge il database per ottenere l'URL dell'immagine. converte l'immagine in un'anteprima, salva l'anteprima in un BLOB, aggiorna il database con l'URL del BLOB dell'anteprima ed elimina il messaggio in coda.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

Il codice nel metodo ConvertImageToThumbnailJPG usa le classi disponibili nello spazio dei nomi System.Drawing per maggiore semplicità.The code in the ConvertImageToThumbnailJPG method uses classes in the System.Drawing namespace for simplicity. Le classi in questo spazio dei nomi, tuttavia, sono state progettate per l'uso con Windows Form.However, the classes in this namespace were designed for use with Windows Forms. Non sono supportate per l'uso in un servizio Windows o ASP.NET.They are not supported for use in a Windows or ASP.NET service. Per altre informazioni sulle opzioni di elaborazione delle immagini, vedere Generazione dinamica delle immagini e Informazioni dettagliate sul ridimensionamento delle immagini.For more information about image-processing options, see Dynamic Image Generation and Deep Inside Image Resizing.

Risoluzione dei problemiTroubleshooting

In caso di problemi durante l'esecuzione delle istruzioni di questa esercitazione, di seguito sono indicati alcuni errori comuni e le relative soluzioni.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

L'oggetto RoleEnvironment è fornito da Azure quando si esegue un'applicazione in Azure o in caso di esecuzione in modalità locale tramite l'emulatore di calcolo di 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 questo errore è visualizzato durante l'esecuzione locale, assicurarsi di avere impostato il progetto ContosoAdsCloudService come progetto di avvio.If you get this error when you're running locally, make sure that you have set the ContosoAdsCloudService project as the startup project. In questo modo, il progetto sarà configurato per l'esecuzione con l'emulatore di calcolo di Azure.This sets up the project to run using the Azure compute emulator.

L'applicazione usa RoleEnvironment di Azure anche per ottenere i valori delle stringhe di connessione archiviati nei file con estensione cscfg. È quindi possibile che questa eccezione sia generata da una stringa di connessione mancante.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. Assicurarsi di avere creato l'impostazione StorageConnectionString per entrambe le configurazioni, cloud e locale, nel progetto ContosoAdsWeb e di avere creato entrambe le stringhe di connessione per entrambe le configurazioni nel progetto 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 si esegue una ricerca di tipo Trova tutto per StorageConnectionString nell'intera soluzione, dovrebbero essere rilevate 9 occorrenze in 6 file.If you do a Find All search for StorageConnectionString in the entire solution, you should see it 9 times in 6 files.

Non è possibile eseguire l'override sulla porta xxx.Cannot override to port xxx. Nuova porta con valore inferiore al minimo consentito 8080 per HTTP protocolloNew port below minimum allowed value 8080 for protocol http

Provare a cambiare il numero di porta usato dal progetto Web.Try changing the port number used by the web project. Fare clic con il pulsante destro del mouse sul progetto ContosoAdsWeb, quindi scegliere Proprietà.Right-click the ContosoAdsWeb project, and then click Properties. Fare clic sulla scheda Web, quindi cambiare il numero di porta nell'impostazione URL progetto.Click the Web tab, and then change the port number in the Project Url setting.

Per un'altra soluzione alternativa che potrebbe risolvere il problema, vedere la sezione successiva.For another alternative that might resolve the problem, see the following section.

Altri errori durante l'esecuzione localeOther errors when running locally

Per impostazione predefinita, i nuovi progetti di servizio cloud usano l'emulatore di calcolo rapido di Azure per simulare l'ambiente di Azure.By default new cloud service projects use the Azure compute emulator express to simulate the Azure environment. Si tratta di una versione semplificata dell'emulatore di calcolo e in alcuni casi l'emulatore di calcolo completo funzionerà mentre la versione rapida non funzionerà.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.

Per modificare il progetto in modo che usi l'emulatore completo, fare clic con il pulsante destro del mouse sul progetto ContosoAdsCloudService, quindi scegliere Proprietà.To change the project to use the full emulator, right-click the ContosoAdsCloudService project, and then click Properties. Nella finestra Proprietà fare clic sulla scheda Web, quindi selezionare il pulsante di opzione Usa emulatore completo.In the Properties window click the Web tab, and then click the Use Full Emulator radio button.

Per eseguire l'applicazione con l'emulatore completo, sarà necessario aprire Visual Studio con privilegi di amministratore.In order to run the application with the full emulator, you have to open Visual Studio with administrator privileges.

Passaggi successiviNext steps

L'applicazione Contoso Ads è intenzionalmente semplice, in modo da essere idonea per un'esercitazione introduttiva.The Contoso Ads application has intentionally been kept simple for a getting-started tutorial. Ad esempio, non implementa l'inserimento di dipendenze o i modelli di archivio e unità di lavoro, non usa un'interfaccia per l'elaborazione, non usa migrazioni Code First EF per gestire le modifiche ai modelli di dati o la resilienza di connessione EF per gestire gli errori di rete temporanei e così via.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.

Di seguito sono indicate alcune applicazioni di esempio per servizi cloud che illustrano procedure di codifica più simili a quelle del mondo reale, elencate in ordine di complessità crescente:Here are some cloud service sample applications that demonstrate more real-world coding practices, listed from less complex to more complex:

Per informazioni generali sullo sviluppo per il cloud, vedere l'articolo relativo alla creazione di applicazioni cloud funzionanti con Azure.For general information about developing for the cloud, see Building Real-World Cloud Apps with Azure.

Per un video introduttivo relativo alle procedure consigliate e ai modelli per Archiviazione di Azure, vedere il video relativo a novità, procedure consigliate e modelli per Archiviazione di Microsoft Azure.For a video introduction to Azure Storage best practices and patterns, see Microsoft Azure Storage – What's New, Best Practices and Patterns.

Per altre informazioni, vedere le seguenti risorse:For more information, see the following resources: