Prise en main des services cloud Azure et d'ASP.NETGet started with Azure Cloud Services and ASP.NET

Vue d'ensembleOverview

Ce didacticiel explique comment créer une application .NET multiniveau avec un composant frontal ASP.NET MVC et comment la déployer sur un service cloud 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’application utilise Azure SQL Database, le service Blob Azure et le service File d’attente Azure.The application uses Azure SQL Database, the Azure Blob service, and the Azure Queue service. Vous pouvez télécharger le projet Visual Studio dans la galerie de code MSDN.You can download the Visual Studio project from the MSDN Code Gallery.

Le didacticiel vous apprend à générer et à exécuter l’application localement, à la déployer dans Azure, à l’exécuter dans le cloud et à la générer intégralement.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. Vous pouvez également démarrer à partir de zéro, puis effectuer les tests et le déploiement par la suite.You can start by building from scratch and then do the test and deploy steps afterward if you prefer.

Application Contoso AdsContoso Ads application

L'application est un panneau d'affichage publicitaire.The application is an advertising bulletin board. Les utilisateurs créent une publicité en entrant du texte et en téléchargeant une image.Users create an ad by entering text and uploading an image. Ils peuvent voir une liste de publicités avec des images en miniature qu’ils peuvent agrandir en sélectionnant la publicité de leur choix.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.

Ad list

L'application utilise le modèle de travail centré sur les files d'attente pour décharger le travail de création de vignettes exigeant en ressources vers un processus principal.The application uses the queue-centric work pattern to off-load the CPU-intensive work of creating thumbnails to a back-end process.

Autre architecture : App Service et WebJobsAlternative architecture: App Service and WebJobs

Ce didacticiel indique comment exécuter le composant frontal et le composant principal dans un service cloud Azure.This tutorial shows how to run both front-end and back-end in an Azure cloud service. Une alternative consiste à exécuter le front-end dans Azure App Service et à utiliser la fonctionnalité WebJobs pour le back-end.An alternative is to run the front-end in Azure App Service and use the WebJobs feature for the back-end. Pour un didacticiel qui utilise Tâches web, reportez-vous à la section Prise en main du Kit de développement logiciel (SDK) Azure Tâches web.For a tutorial that uses WebJobs, see Get Started with the Azure WebJobs SDK. Pour plus d’informations sur le choix des meilleurs services pour votre scénario, reportez-vous à la rubrique Comparaison entre Azure App Service, Azure Cloud Services et Machines virtuelles Azure.For information about how to choose the services that best fit your scenario, see Azure App Service, Cloud Services, and virtual machines comparison.

Ce que vous allez apprendreWhat you'll learn

  • configurer votre ordinateur pour le développement Azure en installant le Kit de développement logiciel (SDK) Azure ;How to enable your machine for Azure development by installing the Azure SDK.
  • créer un service de projet cloud Visual Studio avec un rôle web et un rôle de travail ASP.NET MVC ;How to create a Visual Studio cloud service project with an ASP.NET MVC web role and a worker role.
  • tester localement le projet de service cloud en utilisant l'émulateur de stockage Azure ;How to test the cloud service project locally, using the Azure storage emulator.
  • publier le projet cloud dans un service cloud Azure et le tester avec un compte de stockage Azure ;How to publish the cloud project to an Azure cloud service and test using an Azure storage account.
  • télécharger des fichiers et les stocker dans le service Blob Azure ;How to upload files and store them in the Azure Blob service.
  • utiliser le service de File d'attente Azure pour la communication entre tiers.How to use the Azure Queue service for communication between tiers.

PrérequisPrerequisites

Pour utiliser ce didacticiel, vous devez maîtriser les concepts de base des services cloud Azure et la terminologie afférente, par exemple les rôles web et rôles de travail.The tutorial assumes that you understand basic concepts about Azure cloud services such as web role and worker role terminology. Vous devez également savoir utiliser les projets ASP.NET MVC ou Web Forms dans Visual Studio.It also assumes that you know how to work with ASP.NET MVC or Web Forms projects in Visual Studio. L’exemple d’application utilise MVC, mais une grande part du didacticiel concerne également Web Forms.The sample application uses MVC, but most of the tutorial also applies to Web Forms.

Vous pouvez exécuter l’application localement sans abonnement Azure, mais il vous en faut un pour déployer l’application dans le cloud.You can run the app locally without an Azure subscription, but you'll need one to deploy the application to the cloud. Si vous n’avez pas de compte, vous pouvez activer les avantages de votre abonnement MSDN ou demander une évaluation gratuite.If you don't have an account, you can activate your MSDN subscriber benefits or sign up for a free trial.

Les instructions du didacticiel sont valables pour les produits suivants :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

En l’absence d’un de ces produits, Visual Studio sera automatiquement installé à l’occasion de l’installation du kit de développement logiciel Azure.If you don't have one of these, Visual Studio may be installed automatically when you install the Azure SDK.

Architecture de l'applicationApplication architecture

L'application stocke les publicités dans une base de données SQL et utilise Entity Framework Code First pour créer les tables et accéder aux données.The app stores ads in a SQL database, using Entity Framework Code First to create the tables and access the data. Pour chaque publicité, la base de données stocke deux URL, une pour l’image à taille réelle et l’autre pour la miniature.For each ad, the database stores two URLs, one for the full-size image and one for the thumbnail.

Ad table

Lorsqu'un utilisateur télécharge une image, l'application frontale qui s'exécute dans un rôle web la stocke dans un objet blob Azure, et stocke les informations de la publicité dans la base de données avec une URL qui pointe vers l'objet 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. En même temps, il écrit un message dans une file d'attente Azure.At the same time, it writes a message to an Azure queue. Un processus principal qui s'exécute dans un rôle de travail interroge périodiquement la file d'attente pour connaître les nouveaux messages.A back-end process running in a worker role periodically polls the queue for new messages. Lorsqu'un nouveau message arrive, le rôle de travail crée une vignette pour cette image et met à jour le champ de la base de données des URL des vignettes pour cette publicité.When a new message appears, the worker role creates a thumbnail for that image and updates the thumbnail URL database field for that ad. Le diagramme suivant montre l'interaction des parties de l'application.The following diagram shows how the parts of the application interact.

Contoso Ads architecture

Configuration de l’environnement de développementSet up the development environment

Pour commencer, configurez votre environnement de développement à l’aide de Visual Studio et du Kit de développement logiciel (SDK) Azure.To start, set up your development environment with Visual Studio and the Azure SDK.

Notes

En fonction du nombre de dépendances du Kit de développement logiciel (SDK) déjà présentes sur votre machine, l’installation du Kit risque de prendre un moment, de quelques minutes à plus d’une demi-heure.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.

Téléchargement et exécution de la solution terminéeDownload and run the completed solution

  1. Téléchargez et décompressez la solution terminée.Download and unzip the completed solution.

  2. Démarrez Visual Studio.Start Visual Studio.

  3. Dans le menu Fichier, choisissez Ouvrir un projet, accédez à l’emplacement où vous avez téléchargé la solution, puis ouvrez le fichier de solution.From the File menu choose Open Project, navigate to where you downloaded the solution, and then open the solution file.

  4. Appuyez sur Ctrl+Maj+B pour générer la solution.Press CTRL+SHIFT+B to build the solution.

    Par défaut, Visual Studio restaure automatiquement le contenu du package NuGet, qui n'était pas inclus dans le fichier .zip .By default, Visual Studio automatically restores the NuGet package content, which was not included in the .zip file. Si les packages ne sont pas restaurés, installez-les manuellement en ouvrant la boîte de dialogue Gérer les packages NuGet pour la solution et en cliquant sur le bouton Restaurer en haut à droite.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. Dans l’Explorateur de solutions, assurez-vous que ContosoAdsCloudService est sélectionné comme projet de démarrage.In Solution Explorer, make sure that ContosoAdsCloudService is selected as the startup project.

  6. Si vous utilisez Visual Studio 2015 ou version ultérieure, modifiez la chaîne de connexion SQL Server dans le fichier d’application Web.config du projet ContosoAdsWeb et dans le fichier ServiceConfiguration.Local.cscfg du projet 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. Dans tous les cas, changez « (localdb) \v11.0 » en « (localdb) \MSSQLLocalDB ».In each case, change "(localdb)\v11.0" to "(localdb)\MSSQLLocalDB".

  7. Appuyez sur Ctrl+F5 pour exécuter l’application.Press CTRL+F5 to run the application.

    Lorsque vous exécutez un projet de service cloud localement, Visual Studio appelle automatiquement l’émulateur de calcul Azure et l’émulateur de stockage Azure.When you run a cloud service project locally, Visual Studio automatically invokes the Azure compute emulator and Azure storage emulator. L'émulateur de calcul utilise les ressources de votre ordinateur pour simuler les environnements de rôle Web et de rôle de travail.The compute emulator uses your computer's resources to simulate the web role and worker role environments. L'émulateur de stockage utilise une base de données SQL Server Express LocalDB pour simuler le stockage sur le cloud Azure.The storage emulator uses a SQL Server Express LocalDB database to simulate Azure cloud storage.

    À la première exécution d'un projet de service cloud, le démarrage des émulateurs prend une ou deux minutes.The first time you run a cloud service project, it takes a minute or so for the emulators to start up. Après le démarrage de l'émulateur, le navigateur par défaut s'ouvre sur la page d'accueil de l'application.When emulator startup is finished, the default browser opens to the application home page.

    Contoso Ads architecture

  8. Cliquez sur Créer une publicité.Click Create an Ad.

  9. Entrez des données de test et sélectionnez une image .jpg à télécharger, puis cliquez sur Créer.Enter some test data and select a .jpg image to upload, and then click Create.

    Create page

    L’application ouvre la page Index, mais n’affiche pas de miniature pour la nouvelle publicité, car le processus n’a pas encore eu lieu.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. Attendez un instant, puis actualisez la page Index pour afficher la vignette.Wait a moment and then refresh the Index page to see the thumbnail.

    Page d'index

  11. Cliquez sur l'option Détails de votre publicité pour afficher l'image intégrale.Click Details for your ad to see the full-size image.

    Details page

Vous avez exécuté l'application intégralement sur l'ordinateur local, sans connexion au cloud.You've been running the application entirely on your local computer, with no connection to the cloud. L'émulateur de stockage stocke la file d'attente et les données blob dans une base de données SQL Server Express LocalDB, et l'application stocke les données de la publicité dans une autre base de données LocalDB.The storage emulator stores the queue and blob data in a SQL Server Express LocalDB database, and the application stores the ad data in another LocalDB database. Entity Framework Code First crée automatiquement la base de données de publicités lorsque l'application web essaie pour la première fois d'y accéder.Entity Framework Code First automatically created the ad database the first time the web app tried to access it.

Dans la section suivante, vous allez configurer la solution pour utiliser les ressources de cloud Azure pour les files d'attente, les objets blob et la base de données d'application lorsqu'elle est exécutée dans le 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. Si vous souhaitiez continuer à l’exécuter localement, mais utiliser des ressources de stockage cloud et de base de données, vous pourriez le faire.If you wanted to continue to run locally but use cloud storage and database resources, you could do that. Il suffit de définir des chaînes de connexion, ce que nous allez apprendre à faire.It's just a matter of setting connection strings, which you'll see how to do.

Déploiement de l’application dans AzureDeploy the application to Azure

Pour exécuter l'application dans le cloud, procédez comme suit :You'll do the following steps to run the application in the cloud:

  • Créez un service cloud Azure.Create an Azure cloud service.
  • Créez une base de données Azure SQL.Create an Azure SQL database.
  • Créez un compte de stockage Azure.Create an Azure storage account.
  • Configurez la solution pour utiliser votre base de données Azure SQL lorsqu’elle est exécutée dans Azure.Configure the solution to use your Azure SQL database when it runs in Azure.
  • Configurez la solution pour utiliser votre compte de stockage Azure lorsqu'il est exécuté dans Azure.Configure the solution to use your Azure storage account when it runs in Azure.
  • Déployez le projet dans votre service cloud Azure.Deploy the project to your Azure cloud service.

Création d'un service cloud AzureCreate an Azure cloud service

Un service cloud Azure est l'environnement dans lequel l'application s'exécute.An Azure cloud service is the environment the application will run in.

  1. Dans votre navigateur, ouvrez le portail Azure.In your browser, open the Azure portal.

  2. Cliquez sur Créer une ressource > Calculer > Service cloud.Click Create a resource > Compute > Cloud Service.

  3. Dans la zone de saisie du nom DNS, entrez un préfixe d’URL pour le service cloud.In the DNS name input box, enter a URL prefix for the cloud service.

    Cette URL doit être unique.This URL has to be unique. Un message d’erreur s’affiche si le préfixe que vous choisissez est déjà utilisé.You'll get an error message if the prefix you choose is already in use.

  4. Spécifiez un nouveau groupe de ressources ou le service.Specify a new Resource group for the service. Cliquez sur Créer puis tapez un nom dans la zone de saisie du groupe de ressources, CS_contososadsRG par exemple.Click Create new and then type a name in the Resource group input box, such as CS_contososadsRG.

  5. Choisissez la région dans laquelle vous souhaitez déployer l'application.Choose the region where you want to deploy the application.

    Ce champ indique le centre de données dans lequel votre service cloud sera hébergé.This field specifies which datacenter your cloud service will be hosted in. Pour une application de production, vous devriez choisir la région la plus proche de vos clients.For a production application, you'd choose the region closest to your customers. Pour ce didacticiel, choisissez la région la plus proche de vous.For this tutorial, choose the region closest to you.

  6. Cliquez sur Créer.Click Create.

    Dans l’image suivante, un service cloud est créé avec l’URL CSvccontosoads.cloudapp.net.In the following image, a cloud service is created with the URL CSvccontosoads.cloudapp.net.

    New Cloud Service

Création d’une base de données Azure SQLCreate an Azure SQL database

Lorsque l'application s'exécute dans le cloud, elle utilise une base de données basée sur le cloud.When the app runs in the cloud, it will use a cloud-based database.

  1. Dans le portail Azure, cliquez sur Créer une ressource > Bases de données > SQL Database.In the Azure portal, click Create a resource > Databases > SQL Database.

  2. Dans la zone Nom de la base de données , entrez contosoadsIn the Database Name box, enter contosoads.

  3. Dans le Groupe de ressources, cliquez sur Use existing (Utiliser existant) et sélectionnez le groupe de ressources utilisé pour le service cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.

  4. Dans l’image suivante, cliquez sur Serveur - Configurer les paramètres requis et sur Créer un serveur.In the following image, click Server - Configure required settings and Create a new server.

    Tunnel vers un serveur de base de données

    Si votre abonnement a déjà un serveur, vous pouvez le sélectionner dans la liste déroulante.Alternatively, if your subscription already has a server, you can select that server from the drop-down list.

  5. Dans la zone Nom du serveur, entrez csvccontosodbserver.In the Server name box, enter csvccontosodbserver.

  6. Entrez un Nom de connexion et un Mot de passe d’administrateur.Enter an administrator Login Name and Password.

    Si vous avez sélectionné Créer un serveur, vous ne devez pas entrer un nom et un mot de passe existants ici.If you selected Create a new server, you aren't entering an existing name and password here. Vous entrez de nouveaux nom et mot de passe que vous définissez maintenant pour les utiliser ultérieurement lorsque vous accédez à la base de données.You're entering a new name and password that you're defining now to use later when you access the database. Si vous avez sélectionné un serveur créé auparavant, vous devez entrer le mot de passe du compte d’utilisateur administratif déjà créé.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. Choisissez le même Emplacement que celui choisi pour le service cloud.Choose the same Location that you chose for the cloud service.

    Lorsque le service cloud et la base de données se trouvent dans des centres de données différents (différentes régions), la latence augmente et la bande passante en dehors du centre de données vous est facturée,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. alors qu'elle est gratuite dans un centre de données.Bandwidth within a data center is free.

  8. Cochez Autoriser les services Azure à accéder au serveur.Check Allow azure services to access server.

  9. Cliquez sur Sélectionner pour le nouveau serveur.Click Select for the new server.

    Nouveau serveur SQL Database

  10. Cliquez sur Créer.Click Create.

Créer un compte de stockage AzureCreate an Azure storage account

Un compte de stockage Azure fournit des ressources pour stocker les données de file d'attente et d'objet blob dans le cloud.An Azure storage account provides resources for storing queue and blob data in the cloud.

Dans une application réelle, on crée généralement des comptes distincts pour les données d'application et les données de journalisation, et des comptes distincts pour les données de test et les données de production.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. Pour ce didacticiel, vous allez utiliser un seul compte.For this tutorial, you'll use just one account.

  1. Dans le portail Azure, cliquez sur Créer une ressource > Stockage > Compte de stockage - blob, fichier, table, file d’attente.In the Azure portal, click Create a resource > Storage > Storage account - blob, file, table, queue.

  2. Dans la zone Nom , entrez un préfixe d’URL.In the Name box, enter a URL prefix.

    Ce préfixe, associé au texte visible sous la zone, sera l'URL unique de votre compte de stockage.This prefix plus the text you see under the box will be the unique URL to your storage account. Si le préfixe que vous entrez est déjà utilisé, vous devez en choisir un autre.If the prefix you enter has already been used by someone else, you'll have to choose a different prefix.

  3. Définissez le Modèle de déploiement sur Classique.Set the Deployment model to Classic.

  4. Dans la liste déroulante Réplication, sélectionnez Stockage localement redondant.Set the Replication drop-down list to Locally redundant storage.

    Lorsque la géoréplication est activée pour un compte de stockage, le contenu stocké est répliqué dans un centre de données secondaire pour activer le basculement si un sinistre majeur se produit à l'emplacement principal.When geo-replication is enabled for a storage account, the stored content is replicated to a secondary datacenter to enable failover if a major disaster occurs in the primary location. La géo-réplication peut engendrer des coûts supplémentaires.Geo-replication can incur additional costs. Dans le cas des comptes test et de développement, vous êtes en général peu enclin à payer pour la géo-réplication.For test and development accounts, you generally don't want to pay for geo-replication. Pour plus d’informations, consultez Création, gestion ou suppression d’un compte de stockage.For more information, see Create, manage, or delete a storage account.

  5. Dans le Groupe de ressources, cliquez sur Use existing (Utiliser existant) et sélectionnez le groupe de ressources utilisé pour le service cloud.In the Resource group, click Use existing and select the resource group used for the cloud service.

  6. Dans la liste déroulante Emplacement, sélectionnez la région choisie pour le service cloud.Set the Location drop-down list to the same region you chose for the cloud service.

    Lorsque le service cloud et le compte de stockage se trouvent dans des centres de données différents (différentes régions), la latence augmente et la bande passante en dehors du centre de données vous est facturée,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. alors qu'elle est gratuite dans un centre de données.Bandwidth within a data center is free.

    Les groupes d'affinités Azure fournissent un mécanisme pour minimiser la distance entre les ressources dans un centre de données, ce qui peut réduire la latence.Azure affinity groups provide a mechanism to minimize the distance between resources in a data center, which can reduce latency. Ce didacticiel n'utilise pas de groupes d'affinités.This tutorial does not use affinity groups. Pour plus d'informations, consultez la page Création d'un groupe d'affinités dans Azure.For more information, see How to Create an Affinity Group in Azure.

  7. Cliquez sur Créer.Click Create.

    New storage account

    Dans l’image, un compte de stockage est créé avec l’URL csvccontosoads.core.windows.net.In the image, a storage account is created with the URL csvccontosoads.core.windows.net.

Configuration de la solution pour utiliser votre base de données Azure SQL lorsqu’elle est exécutée dans AzureConfigure the solution to use your Azure SQL database when it runs in Azure

Le projet web et le projet de rôle de travail ont chacun leur chaîne de connexion à la base de données et doivent tous deux pointer vers la base de données Azure SQL lorsque l’application s'exécute dans 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.

Utilisez une transformation Web.config pour le rôle web et un paramètre d'environnement de service cloud pour le rôle de travail.You'll use a Web.config transform for the web role and a cloud service environment setting for the worker role.

Notes

Dans cette section et la suivante, vous allez stocker des informations d’identification dans des fichiers projet.In this section and the next section, you store credentials in project files. Ne stockez pas d'informations confidentielles dans des référentiels de code source publics.Don't store sensitive data in public source code repositories.

  1. Dans le projet ContosoAdsWeb, ouvrez le fichier de transformation Web.Release.config pour le fichier d’application Web.config, supprimez le bloc de commentaires qui contient un élément <connectionStrings>, puis collez le code suivant à la place.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>
    

    Laissez le fichier ouvert pour le modifier.Leave the file open for editing.

  2. Dans le portail Azure, cliquez successivement sur Bases de données SQL dans le volet de gauche, sur la base de données que vous avez créée pour ce didacticiel, puis sur Afficher les chaînes de connexion.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.

    Afficher les chaînes de connexion

    Le portail affiche les chaînes de connexion, avec un espace réservé pour le mot de passe.The portal displays connection strings, with a placeholder for the password.

    Chaînes de connexion

  3. Dans le fichier de transformation Web.Release.config, supprimez {connectionstring} et collez à la place la chaîne de connexion ADO.NET du portail 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. Dans la chaîne de connexion que vous avez collée dans le fichier de transformation Web.Release.config, remplacez {your_password_here} par le mot de passe que vous avez créé pour la nouvelle base de données 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. Enregistrez le fichier .Save the file.

  6. Sélectionnez et copiez la chaîne de connexion (sans les guillemets) pour l'utiliser dans les étapes suivantes de configuration du projet de rôle de travail.Select and copy the connection string (without the surrounding quotation marks) for use in the following steps for configuring the worker role project.

  7. Dans l’Explorateur de solutions, sous Rôles dans le projet de service cloud, cliquez avec le bouton droit sur ContosoAdsWorker, puis sélectionnez Propriétés.In Solution Explorer, under Roles in the cloud service project, right-click ContosoAdsWorker and then click Properties.

    Role properties

  8. Cliquez sur l'onglet Paramètres .Click the Settings tab.

  9. Changez Configuration du service en Cloud.Change Service Configuration to Cloud.

  10. Sélectionnez le champ Valeur du paramètre ContosoAdsDbConnectionString, puis collez la chaîne de connexion que vous avez copiée à partir de la section précédente du didacticiel.Select the Value field for the ContosoAdsDbConnectionString setting, and then paste the connection string that you copied from the previous section of the tutorial.

    Database connection string for worker role

  11. Enregistrez vos modifications.Save your changes.

Configuration de la solution pour utiliser votre compte de stockage Azure lorsqu'elle est exécutée dans AzureConfigure the solution to use your Azure storage account when it runs in Azure

Les chaînes de connexion au compte de stockage Azure pour le projet de rôle web et le projet de rôle de travail sont stockées dans les paramètres d’environnement du projet de service 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. Pour chaque projet, un ensemble distinct de paramètres doit être utilisé lorsque l’application s’exécute localement et dans le 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. Vous allez mettre à jour les paramètres d'environnement de cloud pour les projets de rôle web et de travail.You'll update the cloud environment settings for both web and worker role projects.

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur ContosoAdsWeb sous Rôles dans le projet ContosoAdsCloudService, puis cliquez sur Propriétés.In Solution Explorer, right-click ContosoAdsWeb under Roles in the ContosoAdsCloudService project, and then click Properties.

    Role properties

  2. Cliquez sur l'onglet Paramètres . Dans la liste déroulante Configuration du service, sélectionnez Cloud.Click the Settings tab. In the Service Configuration drop-down box, choose Cloud.

    Cloud configuration

  3. Sélectionnez l’entrée StorageConnectionString. Un bouton représentant des points de suspension ( ... ) apparaît à l’extrémité droite de la ligne.Select the StorageConnectionString entry, and you'll see an ellipsis (...) button at the right end of the line. Cliquez dessus pour ouvrir la boîte de dialogue Créer une chaîne de connexion de compte de stockage.Click the ellipsis button to open the Create Storage Account Connection String dialog box.

    Open Connection String Create box

  4. Dans la boîte de dialogue Créer une chaîne de connexion de compte de stockage, cliquez sur Votre abonnement, choisissez le compte de stockage que vous avez créé précédemment, puis cliquez sur OK.In the Create Storage Connection String dialog box, click Your subscription, choose the storage account that you created earlier, and then click OK. Si vous n'êtes pas déjà connecté, vous êtes invité à entrer vos informations d'identification de compte Azure.If you're not already logged in, you'll be prompted for your Azure account credentials.

    Create Storage Connection String

  5. Enregistrez vos modifications.Save your changes.

  6. Suivez la même procédure que celle que vous avez utilisée pour la chaîne de connexion StorageConnectionString pour définir la chaîne de connexion 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.

    Cette chaîne de connexion est utilisée pour la connexion.This connection string is used for logging.

  7. Suivez la procédure utilisée pour le rôle ContosoAdsWeb pour définir les deux chaînes de connexion pour le rôle ContosoAdsWorker.Follow the same procedure that you used for the ContosoAdsWeb role to set both connection strings for the ContosoAdsWorker role. Pensez à définir Configuration du service sur Cloud.Don't forget to set Service Configuration to Cloud.

Les paramètres d'environnement de rôle configurés à l'aide de l'interface utilisateur de Visual Studio sont stockés dans les fichiers suivants du projet 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 : définit les noms des paramètres.ServiceDefinition.csdef - Defines the setting names.
  • ServiceConfiguration.Cloud.cscfg : fournit des valeurs utilisées lorsque l'application s'exécute dans le cloud.ServiceConfiguration.Cloud.cscfg - Provides values for when the app runs in the cloud.
  • ServiceConfiguration.Local.cscfg : fournit des valeurs utilisées lorsque l'application s'exécute localement.ServiceConfiguration.Local.cscfg - Provides values for when the app runs locally.

Par exemple, le fichier ServiceDefinition.csdef inclut les définitions suivantes :For example, the ServiceDefinition.csdef includes the following definitions:

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

Et le fichier ServiceConfiguration.Cloud.cscfg inclut les valeurs entrées pour ces paramètres dans 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>

Le paramètre <Instances> spécifie le nombre de machines virtuelles sur lesquelles Azure va exécuter le code du rôle de travail.The <Instances> setting specifies the number of virtual machines that Azure will run the worker role code on. La section Étapes suivantes inclut des liens vers d'autres informations sur la montée en charge d'un service cloud.The Next steps section includes links to more information about scaling out a cloud service,

Déployer le projet dans AzureDeploy the project to Azure

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet cloud ContosoAdsCloudService et sélectionnez Publier.In Solution Explorer, right-click the ContosoAdsCloudService cloud project and then select Publish.

    Publish menu

  2. À l’étape Se connecter de l’Assistant Publier l’application Azure, cliquez sur Suivant.In the Sign in step of the Publish Azure Application wizard, click Next.

    Sign in step

  3. À l’étape Paramètres de l’Assistant, cliquez sur Suivant.In the Settings step of the wizard, click Next.

    Settings step

    Les paramètres par défaut sous l'onglet Advanced conviennent pour ce didacticiel.The default settings in the Advanced tab are fine for this tutorial. Pour plus d'informations sur l'onglet avancé, consultez la rubrique Assistant Publication d'application Azure.For information about the advanced tab, see Publish Azure Application Wizard.

  4. À l’étape Résumé, cliquez sur Publier.In the Summary step, click Publish.

    Summary step

    La fenêtre Journal des activités Azure s'ouvre dans Visual Studio.The Azure Activity Log window opens in Visual Studio.

  5. Cliquez sur l'icône représentant une flèche vers la droite pour développer les détails du déploiement.Click the right arrow icon to expand the deployment details.

    Le déploiement peut durer environ 5 minutes, voire plus.The deployment can take up to 5 minutes or more to complete.

    Azure Activity Log window

  6. Une fois le déploiement terminé, cliquez sur l’ URL d’application web pour lancer l’application.When the deployment status is complete, click the Web app URL to start the application.

  7. À ce stade, vous pouvez tester l'application en créant, affichant et modifiant des publicités, comme lorsque vous avez exécuté l'application localement.You can now test the app by creating, viewing, and editing some ads, as you did when you ran the application locally.

Notes

À l'issue du test, supprimez ou arrêtez le service cloud.When you're finished testing, delete or stop the cloud service. Même si vous n'utilisez pas le service cloud, il accumule des frais, car les ressources de la machine virtuelle lui sont réservées.Even if you're not using the cloud service, it's accruing charges because virtual machine resources are reserved for it. Si vous le laissez s'exécuter, toute personne qui trouve votre URL peut créer et afficher des publicités.And if you leave it running, anyone who finds your URL can create and view ads. Dans le portail Azure, ouvrez l’onglet Vue d’ensemble de votre service cloud, puis cliquez sur le bouton Supprimer en haut de la page.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. Si vous voulez juste empêcher temporairement l'accès au site, cliquez sur Arrêter .If you just want to temporarily prevent others from accessing the site, click Stop instead. Dans ce cas, les frais continuent de s'accumuler.In that case, charges will continue to accrue. Vous pouvez suivre une procédure similaire pour supprimer la base de données SQL et le compte de stockage lorsque vous n'en avez plus besoin.You can follow a similar procedure to delete the SQL database and storage account when you no longer need them.

Créer l’application à partir de zéroCreate the application from scratch

Si vous n'avez pas encore téléchargé l'application terminée, faites-le maintenant.If you haven't already downloaded the completed application, do that now. Vous allez copier les fichiers du projet téléchargé dans le nouveau projet.You'll copy files from the downloaded project into the new project.

La création de l'application Contoso Ads implique les étapes suivantes :Creating the Contoso Ads application involves the following steps:

  • création d'une solution Visual Studio de service cloud ;Create a cloud service Visual Studio solution.
  • mise à jour et ajout de packages NuGet ;Update and add NuGet packages.
  • définition des références d'un projet ;Set project references.
  • configuration des chaînes de connexion ;Configure connection strings.
  • ajout de fichiers de code.Add code files.

Une fois la solution créée, vérifiez le code qui est propre aux projets de service cloud et aux objets blob et files d'attente Azure.After the solution is created, you'll review the code that is unique to cloud service projects and Azure blobs and queues.

Création d'une solution Visual Studio de service cloudCreate a cloud service Visual Studio solution

  1. Dans Visual Studio, dans le menu Nouveau projet from the Nouveau projet .In Visual Studio, choose New Project from the File menu.

  2. Dans le volet gauche de la boîte de dialogue Nouveau projet, développez Visual C# et choisissez les modèles Cloud, puis le modèle Azure Cloud Service.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. Nommez le projet et la solution ContosoAdsCloudService, puis cliquez sur OK.Name the project and solution ContosoAdsCloudService, and then click OK.

    Nouveau projet

  4. Dans la boîte de dialogue Nouveau service cloud Azure, ajoutez un rôle web et un rôle de travail.In the New Azure Cloud Service dialog box, add a web role and a worker role. Nommez le rôle web ContosoAdsWeb, et le rôle de travail ContosoAdsWorkerName the web role ContosoAdsWeb, and name the worker role ContosoAdsWorker. (pour modifier le nom par défaut des rôles, utilisez l'icône en forme de crayon dans le volet de droite).(Use the pencil icon in the right-hand pane to change the default names of the roles.)

    New Cloud Service Project

  5. Lorsque la boîte de dialogue Nouveau projet ASP.NET est affichée pour le rôle web, choisissez le modèle MVC et cliquez sur Modifier l’authentification.When you see the New ASP.NET Project dialog box for the web role, choose the MVC template, and then click Change Authentication.

    Modifier l'authentification

  6. Dans la boîte de dialogue Modifier l’authentification, choisissez Aucune authentification et cliquez sur OK.In the Change Authentication dialog box, choose No Authentication, and then click OK.

    Aucune authentification

  7. Dans la boîte de dialogue Nouveau projet ASP.NET, cliquez sur OK.In the New ASP.NET Project dialog, click OK.

  8. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur la solution (pas sur l’un des projets) et choisissez Ajouter - Nouveau projet.In Solution Explorer, right-click the solution (not one of the projects), and choose Add - New Project.

  9. Dans la boîte de dialogue Ajouter un nouveau projet, choisissez Windows sous Visual C# dans le volet gauche, puis cliquez sur le modèle Bibliothèque 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. Nommez le projet ContosoAdsCommon, puis cliquez sur OK.Name the project ContosoAdsCommon, and then click OK.

    Vous devez indiquer le contexte Entity Framework et le modèle de données des projets des rôles web et de travail.You need to reference the Entity Framework context and the data model from both web and worker role projects. Vous pouvez également définir les classes associées à Entity Framework dans le projet de rôle web et faire référence à ce projet dans le projet de rôle de travail.As an alternative, you could define the EF-related classes in the web role project and reference that project from the worker role project. Mais dans l’approche alternative, votre projet de rôle de travail aura une référence inutile aux assemblys web.But in the alternative approach, your worker role project would have a reference to web assemblies that it doesn't need.

Mise à jour et ajout de packages NuGetUpdate and add NuGet packages

  1. Ouvrez la boîte de dialogue Gérer les packages NuGet pour la solution.Open the Manage NuGet Packages dialog box for the solution.

  2. En haut de la fenêtre, sélectionnez Mises à jour.At the top of the window, select Updates.

  3. Recherchez le package WindowsAzure.Storage et, s’il se trouve dans la liste, sélectionnez-le, puis sélectionnez les projets web et de travail concernés par la mise à jour, puis cliquez sur Mettre à jour.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 bibliothèque cliente de stockage est mise à jour plus souvent que les modèles de projet Visual Studio, ce qui explique pourquoi il faut effectuer la mise à jour dans un nouveau projet.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. En haut de la fenêtre, sélectionnez Parcourir.At the top of the window, select Browse.

  5. Recherchez le package NuGet EntityFramework et installez-le dans les trois projets.Find the EntityFramework NuGet package, and install it in all three projects.

  6. Recherchez le package NuGet Microsoft.WindowsAzure.ConfigurationManager et installez-le dans le projet de rôle de travail.Find the Microsoft.WindowsAzure.ConfigurationManager NuGet package, and install it in the worker role project.

Définition des références de projetSet project references

  1. Dans le projet ContosoAdsWeb, définissez une référence au projet ContosoAdsCommon.In the ContosoAdsWeb project, set a reference to the ContosoAdsCommon project. Cliquez avec le bouton droit sur le projet ContosoAdsWeb, puis cliquez sur Références - Ajouter des références.Right-click the ContosoAdsWeb project, and then click References - Add References. Dans la boîte de dialogue Gestionnaire de références, dans le volet gauche, sélectionnez Solution – Projets, puis sélectionnez ContosoAdsCommon et cliquez sur OK.In the Reference Manager dialog box, select Solution – Projects in the left pane, select ContosoAdsCommon, and then click OK.

  2. Dans le projet ContosoAdsWorker, définissez une référence au projet ContosoAdsCommon.In the ContosoAdsWorker project, set a reference to the ContosoAdsCommon project.

    ContosoAdsCommon contient le modèle de données et la classe de contexte Entity Framework, qui seront utilisés par les applications frontale et principale.ContosoAdsCommon will contain the Entity Framework data model and context class, which will be used by both the front-end and back-end.

  3. Dans le projet ContosoAdsWorker, définissez une référence à System.Drawing.In the ContosoAdsWorker project, set a reference to System.Drawing.

    Cet assembly est utilisé par l'application principale pour convertir les images en vignettes.This assembly is used by the back-end to convert images to thumbnails.

Configuration des chaînes de connexionConfigure connection strings

Dans cette section, vous allez configurer les chaînes de connexion Azure Storage et SQL pour un test local.In this section, you configure Azure Storage and SQL connection strings for testing locally. Les instructions de déploiement données précédemment dans le didacticiel expliquent comment paramétrer les chaînes de connexion lorsque l'application s'exécute dans le 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. Dans le projet ContosoAdsWeb, ouvrez le fichier Web.config de l'application et insérez l'élément connectionStrings suivant après l'élément 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>
    

    Si vous utilisez Visual Studio 2015 ou version ultérieure, remplacez « v11.0 » par « MSSQLLocalDB ».If you're using Visual Studio 2015 or higher, replace "v11.0" with "MSSQLLocalDB".

  2. Enregistrez vos modifications.Save your changes.

  3. Dans le projet ContosoAdsCloudService, cliquez avec le bouton droit sur ContosoAdsWeb sous Rôles, puis cliquez sur Propriétés.In the ContosoAdsCloudService project, right-click ContosoAdsWeb under Roles, and then click Properties.

    Role properties

  4. Dans la fenêtre des propriétés ContosAdsWeb [Rôle] , cliquez sur l’onglet Paramètres, puis sur Ajouter un paramètre.In the ContosoAdsWeb [Role] properties window, click the Settings tab, and then click Add Setting.

    Laissez Configuration du service sur Toutes les configurations.Leave Service Configuration set to All Configurations.

  5. Ajoutez un paramètre nommé StorageConnectionString.Add a setting named StorageConnectionString. Définissez Type sur ConnectionString et Value sur UseDevelopmentStorage=true.Set Type to ConnectionString, and set Value to UseDevelopmentStorage=true.

    New connection string

  6. Enregistrez vos modifications.Save your changes.

  7. Suivez la procédure utilisée pour ajouter une chaîne de connexion de stockage dans les propriétés du rôle ContosoAdsWorker.Follow the same procedure to add a storage connection string in the ContosoAdsWorker role properties.

  8. Toujours dans la fenêtre des propriétés ContosoAdsWorker [Rôle] , ajoutez une chaîne de connexion :Still in the ContosoAdsWorker [Role] properties window, add another connection string:

    • Nom : ContosoAdsDbConnectionStringName: ContosoAdsDbConnectionString

    • Tapez : ChaîneType: String

    • Valeur : collez la même chaîne de connexion que celle utilisée pour le projet de rôle web.Value: Paste the same connection string you used for the web role project. (L’exemple suivant concerne Visual Studio 2013.(The following example is for Visual Studio 2013. N’oubliez pas de modifier la source de données si vous copiez cet exemple et utilisez Visual Studio 2015 ou version ultérieure.)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;
      

Ajout de fichiers de codeAdd code files

Dans cette section, vous allez copier les fichiers de code de la solution téléchargée dans la nouvelle solution.In this section, you copy code files from the downloaded solution into the new solution. Les sections suivantes montrent et expliquent les éléments essentiels de ce code.The following sections will show and explain key parts of this code.

Pour ajouter des fichiers à un projet ou à un dossier, cliquez avec le bouton droit sur le projet ou le dossier, puis cliquez sur Ajouter - Élément existant.To add files to a project or a folder, right-click the project or folder and click Add - Existing Item. Sélectionnez les fichiers et cliquez sur Ajouter.Select the files you want and then click Add. Si un message vous demande si vous souhaitez remplacer les fichiers existants, cliquez sur Oui.If asked whether you want to replace existing files, click Yes.

  1. Dans le projet ContosoAdsCommon, supprimez le fichier Class1.cs et ajoutez à la place les fichiers Ad.cs et ContosoAdscontext.cs du projet téléchargé.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. Dans le projet ContosoAdsWeb, ajoutez les fichiers suivants du projet téléchargé.In the ContosoAdsWeb project, add the following files from the downloaded project.

    • Global.asax.cs.Global.asax.cs.
    • Dans le dossier Views\Shared : _Layout.cshtml.In the Views\Shared folder: _Layout.cshtml.
    • Dans le dossier Views\Home : Index.cshtml.In the Views\Home folder: Index.cshtml.
    • Dans le dossier Controllers : AdController.cs.In the Controllers folder: AdController.cs.
    • Dans le dossier Views\Ad (à créer) : cinq fichiers .cshtml.In the Views\Ad folder (create the folder first): five .cshtml files.
  3. Dans le projet ContosoAdsWorker, ajoutez le fichier WorkerRole.cs du projet téléchargé.In the ContosoAdsWorker project, add WorkerRole.cs from the downloaded project.

À ce stade, vous pouvez générer et exécuter l'application comme indiqué précédemment dans le didacticiel. L'application utilisera la base de données locale et les ressources de l'émulateur de stockage.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.

Les sections suivantes présentent le code utilisé dans l'environnement, les objets blob et les files d'attente Azure.The following sections explain the code related to working with the Azure environment, blobs, and queues. Ce didacticiel ne montre pas comment créer des contrôleurs et des vues MVC à l'aide de la structure, comment écrire du code Entity Framework qui fonctionne avec les bases de données SQL Server, ni les bases de la programmation asynchrone dans 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. Pour plus d'informations sur ces sujets, consultez les ressources suivantes :For information about these topics, see the following resources:

ContosoAdsCommon - Ad.csContosoAdsCommon - Ad.cs

Le fichier Ad.cs définit une énumération des catégories de publicité et une classe d'entité POCO pour les informations de publicité.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 spécifie que la classe Ad est utilisée dans une collection DbSet, qui est stockée par Entity Framework dans une base de données 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 a deux constructeurs.The class has two constructors. Le premier est utilisé par le projet web et spécifie le nom d'une chaîne de connexion stockée dans le fichier 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. Le second vous permet de passer la chaîne de connexion réelle utilisée par le projet de rôle de travail, car il n’a pas un fichier 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. Vous avez vu précédemment où est stockée cette chaîne de connexion, et vous allez voir comme le code la récupère quand il instancie la 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

Le code appelé par la méthode Application_Start crée un conteneur d’objets blob images et une file d’attente images, s’ils n’existent pas déjà.Code that is called from the Application_Start method creates an images blob container and an images queue if they don't already exist. Ainsi, à chaque fois que vous utilisez un nouveau compte de stockage ou l'émulateur de stockage sur un nouvel ordinateur, le conteneur d'objets blob et la file d'attente nécessaires sont créés automatiquement.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.

Le code a accès au compte de stockage en utilisant la chaîne de connexion du fichier .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"));

Il obtient ensuite une référence au conteneur d'objets blob images , crée le conteneur s'il n'existe pas déjà et définit les autorisations d'accès au nouveau conteneur.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. Par défaut, les nouveaux conteneurs donnent accès aux objets blob uniquement aux clients possédant des informations d'identification de compte de stockage.By default, new containers only allow clients with storage account credentials to access blobs. Pour le site web, les objets blob doivent être publics pour afficher des images en utilisant des URL qui pointent vers les objets blob des images.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
        });
}

Du code similaire obtient une référence à la file d'attente images et crée une nouvelle file d'attente.Similar code gets a reference to the images queue and creates a new queue. Dans ce cas, aucune modification des autorisations n’est nécessaire.In this case, no permissions change is needed.

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

ContosoAdsWeb - _Layout.cshtmlContosoAdsWeb - _Layout.cshtml

Le fichier _Layout.cshtml définit le nom de l’application dans l’en-tête et le pied de page, puis crée une entrée de menu « Ads ».The _Layout.cshtml file sets the app name in the header and footer, and creates an "Ads" menu entry.

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

Le fichier Views\Home\Index.cshtml affiche les liens de catégorie sur la page d'accueil.The Views\Home\Index.cshtml file displays category links on the home page. Les liens transmettent la valeur entière de l’énumération Category d’une variable querystring à la page 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

Dans le fichier AdController.cs, le constructeur appelle la méthode InitializeStorage pour créer les objets de la bibliothèque cliente Azure Storage, qui fournissent une API pour les objets blob et les files d’attente.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.

Le code obtient ensuite une référence au conteneur d'objets blob images comme vu précédemment dans Global.asax.cs.Then the code gets a reference to the images blob container as you saw earlier in Global.asax.cs. Ce faisant, il définit une stratégie de nouvelles tentatives par défaut appropriée pour une application web.While doing that it sets a default retry policy appropriate for a web app. La stratégie de nouvelles tentatives d'interruption exponentielle par défaut peut suspendre l'application web pendant plus d'une minute en cas de tentatives répétées pour une erreur temporaire.The default exponential backoff retry policy could hang the web app for longer than a minute on repeated retries for a transient fault. La stratégie de nouvelle tentative spécifiée ici laisse trois secondes après chaque nouvelle tentative, jusqu’à trois.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");

Un code similaire obtient une référence à la file d'attente 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 plupart du code du contrôleur permet généralement d'utiliser un modèle de données Entity Framework en utilisant une classe DbContext.Most of the controller code is typical for working with an Entity Framework data model using a DbContext class. La méthode HttpPost Create est une exception, car elle télécharge un fichier et l’enregistre dans le stockage d’objets blob.An exception is the HttpPost Create method, which uploads a file and saves it in blob storage. Le classeur de modèles fournit un objet HttpPostedFileBase à la méthode.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)

Si l'utilisateur a sélectionné un fichier à télécharger, le code met à jour le fichier, l'enregistre dans un objet blob et met à jour l'enregistrement de base de données AD avec une URL qui pointe vers l'objet 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();
}

Le code qui procède au téléchargement se trouve dans la méthode UploadAndSaveBlobAsync .The code that does the upload is in the UploadAndSaveBlobAsync method. Il crée un nom GUID pour l’objet blob, télécharge et enregistre le fichier, et renvoie une référence vers l’objet blob enregistré.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;
}

Dès que la méthode Create HttpPost charge un objet blob et met à jour la base de données, elle crée un message de file d’attente pour informer ce processus de backend qu’une image est prête à être convertie en vignette.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);

Le code de la méthode Edit HttpPost est similaire, mais si l’utilisateur sélectionne un nouveau fichier image, les objets blob existants doivent être supprimés.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'exemple suivant illustre le code qui supprime les objets blob lorsque vous supprimez une publicité.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 et Details.cshtmlContosoAdsWeb - Views\Ad\Index.cshtml and Details.cshtml

Le fichier Index.cshtml affiche des vignettes avec les autres données de publicité.The Index.cshtml file displays thumbnails with the other ad data.

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

Le fichier Details.cshtml affiche l'image intégrale.The Details.cshtml file displays the full-size image.

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

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

Les fichiers Create.cshtml et Edit.cshtml spécifient l’encodage de formulaire qui permet au contrôleur d’obtenir l’objet 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 élément <input> indique au navigateur de fournir une boîte de dialogue de sélection de fichier.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éthode OnStartContosoAdsWorker - WorkerRole.cs - OnStart method

L’environnement du rôle de travail Azure appelle la méthode OnStart de la classe WorkerRole lorsque le rôle de travail est démarré, puis appelle la méthode Run à la fin de la méthode 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.

La méthode OnStart obtient la chaîne de connexion à la base de données à partir du fichier .cscfg et la transmet à la classe DbContext d’Entity Framework.The OnStart method gets the database connection string from the .cscfg file and passes it to the Entity Framework DbContext class. Le fournisseur SQLClient est utilisé par défaut et n'a donc pas besoin d'être spécifié.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);

La méthode obtient ensuite une référence au compte de stockage et crée le conteneur d’objets blob et la file d’attente s’ils n’existent pas déjà.After that, the method gets a reference to the storage account and creates the blob container and queue if they don't exist. Le code correspondant est celui que vous avez déjà vu dans la méthode Application_Start du rôle Web.The code for that is similar to what you already saw in the web role Application_Start method.

ContosoAdsWorker - WorkerRole.cs - Méthode RunContosoAdsWorker - WorkerRole.cs - Run method

La méthode Run est appelée lorsque la méthode OnStart a terminé son travail d’initialisation.The Run method is called when the OnStart method finishes its initialization work. La méthode exécute une boucle infinie qui recherche des messages de file d'attente et les traite lorsqu'ils arrivent.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);
        }
    }
}

Après chaque itération de la boucle, si aucun message de file d'attente n'a été trouvé, le programme se met en veille pendant une seconde.After each iteration of the loop, if no queue message was found, the program sleeps for a second. Cela évite au rôle de travail un temps processeur et des coûts de transaction de stockage trop élevés.This prevents the worker role from incurring excessive CPU time and storage transaction costs. L’équipe de conseil clientèle Microsoft raconte une anecdote sur un développeur qui, avant de partir en vacances, avait oublié d’inclure ce point et avait procédé au déploiement en production.The Microsoft Customer Advisory Team tells a story about a developer who forgot to include this, deployed to production, and left for vacation. Lorsqu’ils sont arrivés en retour, leurs coûts de surveillance sont plus coûteuses que les congés.When they got back, their oversight cost more than the vacation.

Il arrive que le contenu d'un message de file d'attente provoque une erreur de traitement.Sometimes the content of a queue message causes an error in processing. On parle alors de message empoisonné, et si vous relancez la boucle après avoir consigné une erreur, vous risquez d'essayer sans fin de traiter ce message.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. Le bloc catch inclut donc une instruction If qui vérifie combien de fois l'application a tenté de traiter le message actuel, et si le nombre de tentatives est supérieur à 5, le message est supprimé de la file d'attente.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 est appelé lorsqu'un message de file d'attente est trouvé.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);
}

Ce code lit la base de données pour obtenir l'URL de l'image, convertit l'image en vignette, enregistre la vignette dans un objet blob, met à jour la base de données avec l'URL de l'objet blob de la vignette et supprime le message de la file d'attente.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.

Notes

Pour plus de simplicité, le code de la méthode ConvertImageToThumbnailJPG utilise des classes dans l’espace de noms System.Drawing.The code in the ConvertImageToThumbnailJPG method uses classes in the System.Drawing namespace for simplicity. Cependant, les classes de cet espace de noms ont été conçues pour être utilisées avec Windows Forms.However, the classes in this namespace were designed for use with Windows Forms. Elles ne sont pas prises en charge dans un service Windows ou ASP.NET.They are not supported for use in a Windows or ASP.NET service. Pour plus d’informations sur les options de traitement d’images, consultez Génération d’images dynamiques et Redimensionnement d’images approfondi.For more information about image-processing options, see Dynamic Image Generation and Deep Inside Image Resizing.

Résolution de problèmesTroubleshooting

Voici quelques erreurs courantes et leur solution en cas de problème lorsque vous suivez les instructions de ce didacticiel.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’objet RoleEnvironment est fourni par Azure lorsque vous exécutez une application dans Azure ou lorsque vous l’exécutez localement à l’aide de l’émulateur de calcul 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. Si vous obtenez cette erreur lors de l'exécution en local, vérifiez si le projet ContosoAdsCloudService est défini comme projet de démarrage.If you get this error when you're running locally, make sure that you have set the ContosoAdsCloudService project as the startup project. Cela permet au projet de s'exécuter avec l'émulateur de calcul Azure.This sets up the project to run using the Azure compute emulator.

L'application utilise notamment la classe RoleEnvironment Azure pour obtenir les valeurs de chaîne de connexion qui sont stockées dans les fichiers .cscfg , et l'absence de chaîne de connexion est une autre cause de cette exception.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. Veillez à créer le paramètre StorageConnectionString pour les configurations cloud et locale dans le projet ContosoAdsWeb et créez les deux chaînes de connexion pour les deux configurations dans le projet 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. Si vous effectuez une recherche de type Rechercher tout pour StorageConnectionString dans toute la solution, vous devez la voir 9 fois dans 6 fichiers.If you do a Find All search for StorageConnectionString in the entire solution, you should see it 9 times in 6 files.

Impossible de remplacer par le port xxx.Cannot override to port xxx. La valeur du nouveau port est inférieure à la valeur minimale autorisée de 8080 pour le protocole httpNew port below minimum allowed value 8080 for protocol http

Changez le numéro du port utilisé par le projet web.Try changing the port number used by the web project. Cliquez avec le bouton droit sur le projet ContosoAdsWeb, puis cliquez sur Propriétés.Right-click the ContosoAdsWeb project, and then click Properties. Cliquez sur l’onglet Web et changez le numéro du port dans le paramètre URL du projet.Click the Web tab, and then change the port number in the Project Url setting.

Vous trouverez une autre solution au problème dans la section suivante.For another alternative that might resolve the problem, see the following section.

Autres erreurs lors de l'exécution localeOther errors when running locally

Par défaut, les nouveaux projets de service cloud utilisent l'émulateur de calcul Azure express pour simuler l'environnement Azure.By default new cloud service projects use the Azure compute emulator express to simulate the Azure environment. Il s'agit d'une version légère de l'émulateur de calcul, mais il peut arriver que la version express ne fonctionne pas là où l'émulateur complet fonctionne.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.

Pour que le projet utilise la version complète de l'émulateur, cliquez avec le bouton droit sur le projet ContosoAdsCloudService, puis cliquez sur Propriétés.To change the project to use the full emulator, right-click the ContosoAdsCloudService project, and then click Properties. Dans la fenêtre Propriétés, cliquez sur l’onglet Web, puis sur la case d’option Utiliser l’émulateur complet.In the Properties window click the Web tab, and then click the Use Full Emulator radio button.

Pour exécuter l'application avec l'émulateur complet, vous devez ouvrir Visual Studio avec les privilèges d'administrateur.In order to run the application with the full emulator, you have to open Visual Studio with administrator privileges.

Étapes suivantesNext steps

L'application Contoso Ads est intentionnellement simple pour un didacticiel de prise en main.The Contoso Ads application has intentionally been kept simple for a getting-started tutorial. Par exemple, elle n’implémente pas l’injection de dépendances ni les modèles de référentiel et d’élément de travail, elle n’utilise pas d’interface pour la connexion, ni les migrations Code First EF pour gérer les changements de modèles de données ou la résilience des connexions EF pour gérer les erreurs réseau temporaires, 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.

Voici quelques exemples d'applications de service cloud qui montrent des pratiques d'encodage réelles, de la plus simple à la plus complexe :Here are some cloud service sample applications that demonstrate more real-world coding practices, listed from less complex to more complex:

Pour obtenir des informations générales sur le développement pour le cloud, consultez la rubrique Création d’applications cloud réalistes avec Azure.For general information about developing for the cloud, see Building Real-World Cloud Apps with Azure.

Pour voir une vidéo de présentation des meilleures pratiques et des modèles Azure Storage, consultez la rubrique Microsoft Azure Storage – Nouveautés, meilleures pratiques et modèles.For a video introduction to Azure Storage best practices and patterns, see Microsoft Azure Storage – What's New, Best Practices and Patterns.

Pour plus d’informations, consultez les ressources suivantes :For more information, see the following resources: