Applicazione .NET multilivello che usa code del bus di servizio.NET multi-tier application using Azure Service Bus queues

Microsoft Azure consente di sviluppare applicazioni con la stessa semplicità offerta da Visual Studio e Azure SDK gratuito per .NET.Developing for Microsoft Azure is easy using Visual Studio and the free Azure SDK for .NET. Questa esercitazione illustra i passaggi per creare un'applicazione che usa più risorse di Azure in esecuzione nell'ambiente locale.This tutorial walks you through the steps to create an application that uses multiple Azure resources running in your local environment.

Verranno illustrate le operazioni seguenti:You will learn the following:

  • Abilitare il computer in uso per lo sviluppo per Azure tramite un singolo download e una singola installazione.How to enable your computer for Azure development with a single download and install.
  • Utilizzare Visual Studio per lo sviluppo per Azure.How to use Visual Studio to develop for Azure.
  • Creare un'applicazione multilivello in Azure utilizzando ruoli Web e ruoli di lavoro.How to create a multi-tier application in Azure using web and worker roles.
  • Consentire le comunicazioni tra i livelli usando le code del bus di servizio.How to communicate between tiers using Service Bus queues.

Nota

Per completare l'esercitazione, è necessario un account Azure.To complete this tutorial, you need an Azure account. È possibile attivare i benefici della sottoscrizione MSDN o iscriversi per un account gratuito.You can activate your MSDN subscriber benefits or sign up for a free account.

In questa esercitazione verrà creata ed eseguita un'applicazione multilivello in un servizio cloud di Azure.In this tutorial you'll build and run the multi-tier application in an Azure cloud service. Il front-end è un ruolo Web ASP.NET MVC e il back-end è un ruolo di lavoro che usa una coda del bus di servizio.The front end is an ASP.NET MVC web role and the back end is a worker-role that uses a Service Bus queue. È possibile creare la stessa applicazione multilivello con il front-end come progetto Web distribuito in un sito Web di Azure invece che in un servizio cloud.You can create the same multi-tier application with the front end as a web project, that is deployed to an Azure website instead of a cloud service. È anche possibile vedere l'esercitazione sull'applicazione .NET ibrida locale/sul cloud.You can also try out the .NET on-premises/cloud hybrid application tutorial.

Nella schermata seguente è illustrata l'applicazione completata.The following screen shot shows the completed application.

Informazioni generali sullo scenario: comunicazione tra ruoliScenario overview: inter-role communication

Per inviare un ordine per l'elaborazione, è necessario che il componente dell'interfaccia utente front-end, in esecuzione nel ruolo Web, interagisca con la logica di livello intermedio in esecuzione nel ruolo di lavoro.To submit an order for processing, the front-end UI component, running in the web role, must interact with the middle tier logic running in the worker role. Questo esempio usa la messaggistica del bus di servizio per la comunicazione tra i livelli.This example uses Service Bus messaging for the communication between the tiers.

L'uso della messaggistica del bus di servizio tra il livello Web e il livello intermedio consente di disaccoppiare i due componenti.Using Service Bus messaging between the web and middle tiers decouples the two components. Invece di usare la messaggistica diretta, ovvero TCP o HTTP, il livello Web non si connette direttamente al livello intermedio, ma inserisce unità di lavoro, ad esempio messaggi, nel bus di servizio, che li conserva in modo affidabile fino a quando il livello intermedio non sarà pronto per usarli ed elaborarli.In contrast to direct messaging (that is, TCP or HTTP), the web tier does not connect to the middle tier directly; instead it pushes units of work, as messages, into Service Bus, which reliably retains them until the middle tier is ready to consume and process them.

Il bus di servizio offre due entità per il supporto della messaggistica negoziata, ovvero le code e gli argomenti.Service Bus provides two entities to support brokered messaging: queues and topics. Se si usano le code, ogni messaggio inviato alla coda viene usato da un ricevitore singolo.With queues, each message sent to the queue is consumed by a single receiver. Gli argomenti supportano il modello pubblicazione/sottoscrizione, in cui ogni messaggio pubblicato viene reso disponibile a una sottoscrizione registrata per l'argomento.Topics support the publish/subscribe pattern in which each published message is made available to a subscription registered with the topic. Ogni sottoscrizione mantiene in modo logico la propria coda di messaggi.Each subscription logically maintains its own queue of messages. È anche possibile configurare le sottoscrizioni specificando regole di filtro per limitare i set di messaggi passati alla coda della sottoscrizione ai soli messaggi corrispondenti al filtro.Subscriptions can also be configured with filter rules that restrict the set of messages passed to the subscription queue to those that match the filter. Nel seguente esempio vengono usate le code del bus di servizio.The following example uses Service Bus queues.

Questo meccanismo di comunicazione presenta alcuni vantaggi rispetto alla messaggistica diretta:This communication mechanism has several advantages over direct messaging:

  • Disaccoppiamento temporaneo.Temporal decoupling. Grazie al modello di messaggistica asincrono, non è necessario che produttori e consumer siano online nello stesso momento.With the asynchronous messaging pattern, producers and consumers need not be online at the same time. I messaggi vengono archiviati in modo affidabile nel bus di servizio fino a quando il consumer non sarà pronto per riceverli.Service Bus reliably stores messages until the consuming party is ready to receive them. Questo consente la disconnessione volontaria (ad esempio, per attività di manutenzione) o involontaria (a seguito di un guasto) dei componenti dell'applicazione distribuita senza ripercussioni sull'intero sistema.This enables the components of the distributed application to be disconnected, either voluntarily, for example, for maintenance, or due to a component crash, without impacting the system as a whole. È inoltre possibile che l'applicazione consumer debba essere online solo in determinati orari.Furthermore, the consuming application might only need to come online during certain times of the day.
  • Livellamento del carico.Load leveling. In molte applicazioni il carico del sistema varia in base al momento, mentre il tempo di elaborazione richiesto per ogni unità di lavoro è in genere costante.In many applications, system load varies over time, while the processing time required for each unit of work is typically constant. L'interposizione di una coda tra producer e consumer di messaggi implica che è necessario solo eseguire il provisioning dell'applicazione consumer (il ruolo di lavoro) per consentire a quest'ultima di gestire un carico medio anziché il carico massimo.Intermediating message producers and consumers with a queue means that the consuming application (the worker) only needs to be provisioned to accommodate average load rather than peak load. In base alla variazione del carico in ingresso, si verificherà un incremento o una riduzione della profondità della coda,The depth of the queue grows and contracts as the incoming load varies. con un risparmio diretto in termini economici rispetto alle risorse infrastrutturali richieste per gestire il carico dell'applicazione.This directly saves money in terms of the amount of infrastructure required to service the application load.
  • Bilanciamento del carico.Load balancing. Con l'aumento del carico, è possibile aggiungere altri processi di lavoro per la lettura della coda.As load increases, more worker processes can be added to read from the queue. Ciascun messaggio viene elaborato da un solo processo di lavoro.Each message is processed by only one of the worker processes. Inoltre, il bilanciamento del carico di tipo pull consente un uso ottimale delle macchine di lavoro anche quando queste presentano una potenza di elaborazione diversa. Ogni macchina effettuerà infatti il pull dei messaggi alla propria velocità massima.Furthermore, this pull-based load balancing enables optimal use of the worker machines even if the worker machines differ in terms of processing power, as they will pull messages at their own maximum rate. Questo modello viene spesso definito modello del consumer concorrente.This pattern is often termed the competing consumer pattern.

Il codice che consente di implementare questa architettura viene illustrato nelle sezioni seguenti.The following sections discuss the code that implements this architecture.

Creare uno spazio dei nomiCreate a namespace

Il primo passaggio consiste nel creare uno spazio dei nomi e ottenere una chiave di firma di accesso condiviso per tale spazio.The first step is to create a namespace, and obtain a Shared Access Signature (SAS) key for that namespace. Uno spazio dei nomi fornisce un limite per ogni applicazione esposta tramite il bus di servizio.A namespace provides an application boundary for each application exposed through Service Bus. Una chiave di firma di accesso condiviso viene generata dal sistema quando viene creato uno spazio dei nomi.A SAS key is generated by the system when a namespace is created. La combinazione di spazio dei nomi e chiave di firma di accesso condiviso fornisce le credenziali che consentono al bus di servizio di autenticare l'accesso a un'applicazione.The combination of namespace name and SAS key provides the credentials for Service Bus to authenticate access to an application.

Per iniziare a usare le entità di messaggistica del bus di servizio in Azure, prima di tutto è necessario creare uno spazio dei nomi con un nome univoco in Azure.To begin using Service Bus messaging entities in Azure, you must first create a namespace with a name that is unique across Azure. Uno spazio dei nomi fornisce un contenitore di ambito per fare riferimento alle risorse del bus di servizio all'interno dell'applicazione.A namespace provides a scoping container for addressing Service Bus resources within your application.

Per creare uno spazio dei nomi:To create a namespace:

  1. Accedere al portale di Azure.Sign in to the Azure portal.
  2. Nel riquadro di spostamento a sinistra del portale fare clic su + Crea una risorsa e quindi su Integrazione e su Bus di servizio.In the left navigation pane of the portal, click + Create a resource, then click Integration, and then click Service Bus.
  3. Nella finestra di dialogo Crea spazio dei nomi immettere un nome per lo spazio dei nomi.In the Create namespace dialog, enter a namespace name. Verrà effettuato immediatamente un controllo sulla disponibilità del nome.The system immediately checks to see if the name is available.
  4. Dopo aver verificato che il nome dello spazio dei nomi sia disponibile, scegliere il piano tariffario, ovvero Basic, Standard o Premium.After making sure the namespace name is available, choose the pricing tier (Basic, Standard, or Premium). Se si vogliono usare argomenti e sottoscrizioni, scegliere Standard o Premium.If you want to use topics and subscriptions, make sure to choose either Standard or Premium. Argomenti e sottoscrizioni non sono supportati nel piano tariffario Basic.Topics/subscriptions are not supported in the Basic pricing tier.
  5. Nel campo Sottoscrizione scegliere una sottoscrizione di Azure in cui creare lo spazio dei nomi.In the Subscription field, choose an Azure subscription in which to create the namespace.
  6. Nel campo Gruppo di risorse scegliere un gruppo di risorse esistente nel quale risiederà lo spazio dei nomi oppure crearne uno nuovo.In the Resource group field, choose an existing resource group in which the namespace will live, or create a new one.
  7. In Localitàscegliere il paese o l'area in cui deve essere ospitato lo spazio dei nomi.In Location, choose the country or region in which your namespace should be hosted.

    Crea spazio dei nomi

  8. Fare clic su Crea.Click Create. A questo punto, lo spazio dei nomi verrà creato e abilitato nel sistema.The system now creates your namespace and enables it. Potrebbero essere necessari alcuni minuti per consentire al sistema di effettuare il provisioning delle risorse per lo spazio dei nomi creato.You might have to wait several minutes as the system provisions resources for your account.

Ottenere le credenziali di gestioneObtain the management credentials

Con la creazione di un nuovo spazio dei nomi viene generata automaticamente una regola di firma di accesso condiviso iniziale con una coppia associata di chiavi primaria e secondaria, ognuna delle quali concede il controllo completo su tutti gli aspetti dello spazio dei nomi.Creating a new namespace automatically generates an initial Shared Access Signature (SAS) rule with an associated pair of primary and secondary keys that each grant full control over all aspects of the namespace. Per informazioni su come creare altre regole con diritti più limitati per mittenti e ricevitori normali, vedere Autenticazione e autorizzazione del bus di servizio.See Service Bus authentication and authorization for information about how to create further rules with more constrained rights for regular senders and receivers. Per copiare la regola iniziale seguire questa procedura:To copy the initial rule, follow these steps:

  1. Fare clic su Tutte le risorse, quindi sul nome dello spazio dei nomi appena creato.Click All resources, then click the newly created namespace name.
  2. Nella finestra dello spazio dei nomi fare clic su Criteri di accesso condiviso.In the namespace window, click Shared access policies.
  3. Nella schermata Criteri di accesso condiviso fare clic su RootManageSharedAccessKey.In the Shared access policies screen, click RootManageSharedAccessKey.

    connection-info

  4. Nella finestra Criteri: RootManageSharedAccessKey fare clic sul pulsante Copia accanto a Stringa di connessione - chiave primaria per copiare la stringa di connessione negli Appunti e usarla in un secondo momento.In the Policy: RootManageSharedAccessKey window, click the copy button next to Connection string–primary key, to copy the connection string to your clipboard for later use. Incollare questo valore nel Blocco note o in un'altra posizione temporanea.Paste this value into Notepad or some other temporary location.

    connection-string

  5. Ripetere il passaggio precedente e copiare e incollare il valore della chiave primaria in un percorso temporaneo per usarlo in seguito.Repeat the previous step, copying and pasting the value of Primary key to a temporary location for later use.

Creare un ruolo webCreate a web role

Creare in questa sezione il front-end dell'applicazione.In this section, you build the front end of your application. Creare prima di tutto le pagine visualizzate dall'applicazione.First, you create the pages that your application displays. Aggiungere quindi il codice per inviare elementi a una coda del bus di servizio e visualizzare informazioni relative allo stato della coda.After that, add code that submits items to a Service Bus queue and displays status information about the queue.

Creare il progettoCreate the project

  1. Avviare Visual Studio con privilegi di amministratore: fare clic con il pulsante destro del mouse sull'icona del programma Visual Studio e quindi scegliere Esegui come amministratore.Using administrator privileges, start Visual Studio: right-click the Visual Studio program icon, and then click Run as administrator. Per l'emulatore di calcolo di Azure, illustrato più avanti in questo articolo, è necessario che Visual Studio sia avviato con privilegi di amministratore.The Azure compute emulator, discussed later in this article, requires that Visual Studio be started with administrator privileges.

    In Visual Studio scegliere Nuovo dal menu File, quindi fare clic su Progetto.In Visual Studio, on the File menu, click New, and then click Project.

  2. Da Modelli installati in Visual C# fare clic su Cloud e quindi su Servizio cloud di Azure.From Installed Templates, under Visual C#, click Cloud and then click Azure Cloud Service. Assegnare al progetto il nome MultiTierApp.Name the project MultiTierApp. Fare quindi clic su OK.Then click OK.

  3. Nel riquadro Ruoli fare doppio clic su Ruolo Web ASP.NET.From the Roles pane, double-click ASP.NET Web Role.

  4. Passare il puntatore su WebRole1 in Soluzione servizio cloud di Microsoft Azure, quindi fare clic sull'icona a forma di matita e rinominare il ruolo Web in FrontendWebRole.Hover over WebRole1 under Azure Cloud Service solution, click the pencil icon, and rename the web role to FrontendWebRole. Fare quindi clic su OK.Then click OK. Assicurarsi di immettere "Frontend" con una 'e' minuscola, non "FrontEnd".(Make sure you enter "Frontend" with a lower-case 'e,' not "FrontEnd".)

  5. Nella finestra di dialogo Nuovo progetto ASP.NET fare clic su MVC in Seleziona modello.From the New ASP.NET Project dialog box, in the Select a template list, click MVC.

  6. Sempre nella finestra di dialogo Nuovo progetto ASP.NET fare clic sul pulsante Modifica autenticazione.Still in the New ASP.NET Project dialog box, click the Change Authentication button. Nella finestra di dialogo Modifica autenticazione assicurarsi che sia selezionato Nessuna autenticazione e quindi fare clic su OK.In the Change Authentication dialog box, ensure that No Authentication is selected, and then click OK. Per questa esercitazione si distribuisce un'applicazione che non richiede l'accesso utente.For this tutorial, you're deploying an app that doesn't need a user login.

  7. Nella finestra di dialogo Nuovo progetto ASP.NET fare clic su OK per creare il progetto.Back in the New ASP.NET Project dialog box, click OK to create the project.
  8. In Esplora soluzioni fare clic con il pulsante destro del mouse su Riferimenti nel progetto FrontendWebRole e quindi scegliere Gestisci pacchetti NuGet.In Solution Explorer, in the FrontendWebRole project, right-click References, then click Manage NuGet Packages.
  9. Fare clic sulla scheda Sfoglia e quindi cercare WindowsAzure.ServiceBus.Click the Browse tab, then search for WindowsAzure.ServiceBus. Selezionare il pacchetto WindowsAzure.ServiceBus, fare clic su Installa e quindi accettare le condizioni per l'utilizzo.Select the WindowsAzure.ServiceBus package, click Install, and accept the terms of use.

    Sono ora disponibili riferimenti agli assembly client necessari e sono stati aggiunti nuovi file di codice.Note that the required client assemblies are now referenced and some new code files have been added.

  10. In Esplora soluzioni fare clic con il pulsante destro del mouse su Modelli, quindi scegliere Aggiungi e infine Classe.In Solution Explorer, right-click Models and click Add, then click Class. Nella casella Nome digitare il nome OnlineOrder.cs.In the Name box, type the name OnlineOrder.cs. Fare quindi clic su Aggiungi.Then click Add.

Scrivere il codice per il ruolo WebWrite the code for your web role

Creare prima di tutto in questa sezione le diverse pagine visualizzate dall'applicazione.In this section, you create the various pages that your application displays.

  1. In Visual Studio, nel file OnlineOrder.cs sostituire la definizione dello spazio dei nomi esistente con il codice seguente:In the OnlineOrder.cs file in Visual Studio, replace the existing namespace definition with the following code:

    namespace FrontendWebRole.Models
    {
        public class OnlineOrder
        {
            public string Customer { get; set; }
            public string Product { get; set; }
        }
    }
    
  2. In Esplora soluzioni fare doppio clic su Controllers\HomeController.cs.In Solution Explorer, double-click Controllers\HomeController.cs. Aggiungere le istruzioni using seguenti nella parte iniziale del file per includere gli spazi dei nomi per il modello appena creato, oltre al bus di servizio.Add the following using statements at the top of the file to include the namespaces for the model you just created, as well as Service Bus.

    using FrontendWebRole.Models;
    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
  3. Anche nel file HomeController.cs sostituire la definizione dello spazio dei nomi esistente con il seguente codice.Also in the HomeController.cs file in Visual Studio, replace the existing namespace definition with the following code. Tale codice include metodi per la gestione dell'invio di elementi alla coda.This code contains methods for handling the submission of items to the queue.

    namespace FrontendWebRole.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                // Simply redirect to Submit, since Submit will serve as the
                // front page of this application.
                return RedirectToAction("Submit");
            }
    
            public ActionResult About()
            {
                return View();
            }
    
            // GET: /Home/Submit.
            // Controller method for a view you will create for the submission
            // form.
            public ActionResult Submit()
            {
                // Will put code for displaying queue message count here.
    
                return View();
            }
    
            // POST: /Home/Submit.
            // Controller method for handling submissions from the submission
            // form.
            [HttpPost]
            // Attribute to help prevent cross-site scripting attacks and
            // cross-site request forgery.  
            [ValidateAntiForgeryToken]
            public ActionResult Submit(OnlineOrder order)
            {
                if (ModelState.IsValid)
                {
                    // Will put code for submitting to queue here.
    
                    return RedirectToAction("Submit");
                }
                else
                {
                    return View(order);
                }
            }
        }
    }
    
  4. Scegliere Compila soluzione dal menu Compila per verificare la correttezza del lavoro svolto finora.From the Build menu, click Build Solution to test the accuracy of your work so far.
  5. Creare quindi la visualizzazione per il metodo Submit() creato in precedenza.Now, create the view for the Submit() method you created earlier. Fare clic con il pulsante destro del mouse all'interno del metodo Submit(), ovvero l'overload del metodo Submit() che non accetta parametri, e quindi scegliere Aggiungi visualizzazione.Right-click within the Submit() method (the overload of Submit() that takes no parameters), and then choose Add View.

  6. Viene visualizzata una finestra di dialogo per la creazione della visualizzazione.A dialog box appears for creating the view. Nell'elenco Modello scegliere Crea.In the Template list, choose Create. Nell'elenco Classe modello selezionare la classe OnlineOrder.In the Model class list, select the OnlineOrder class.

  7. Fare clic su Aggiungi.Click Add.
  8. Modificare ora il nome visualizzato dell'applicazione.Now, change the displayed name of your application. In Esplora soluzioni fare doppio clic sul file Views\Shared\_Layout.cshtml per aprirlo nell'editor di Visual Studio.In Solution Explorer, double-click the Views\Shared\_Layout.cshtml file to open it in the Visual Studio editor.
  9. Sostituire tutte le occorrenze di My ASP.NET Application con Northwind Traders Products.Replace all occurrences of My ASP.NET Application with Northwind Traders Products.
  10. Rimuovere i collegamenti Home, About e Contact.Remove the Home, About, and Contact links. Eliminare il codice evidenziato:Delete the highlighted code:

  11. Modificare infine la pagina di invio in modo da includere informazioni sulla coda.Finally, modify the submission page to include some information about the queue. In Esplora soluzioni fare doppio clic sul file Views\Home\Submit.cshtml per aprirlo nell'editor di Visual Studio.In Solution Explorer, double-click the Views\Home\Submit.cshtml file to open it in the Visual Studio editor. Aggiungere la riga seguente dopo <h2>Submit</h2>.Add the following line after <h2>Submit</h2>. Per ora ViewBag.MessageCount non contiene valori.For now, the ViewBag.MessageCount is empty. Il valore verrà inserito successivamente.You will populate it later.

    <p>Current number of orders in queue waiting to be processed: @ViewBag.MessageCount</p>
    
  12. L'interfaccia utente è stata implementata.You now have implemented your UI. È possibile premere F5 per eseguire l'applicazione e confermare che abbia l'aspetto previsto.You can press F5 to run your application and confirm that it looks as expected.

Scrivere codice per l'invio di elementi a una coda del bus di servizioWrite the code for submitting items to a Service Bus queue

Aggiungere quindi il codice per l'invio di elementi a una coda.Now, add code for submitting items to a queue. Creare prima di tutto una classe contenente le informazioni di connessione della coda del bus di servizio.First, you create a class that contains your Service Bus queue connection information. Inizializzare quindi la connessione da Global.aspx.cs.Then, initialize your connection from Global.aspx.cs. Aggiornare infine il codice di invio creato in precedenza in HomeController.cs in modo da inviare effettivamente elementi alla coda del bus di servizio.Finally, update the submission code you created earlier in HomeController.cs to actually submit items to a Service Bus queue.

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su FrontendWebRole. È necessario fare clic con il pulsante destro del mouse sul progetto, non sul ruolo.In Solution Explorer, right-click FrontendWebRole (right-click the project, not the role). Fare clic su Aggiungi, quindi su Classe.Click Add, and then click Class.
  2. Assegnare alla classe il nome QueueConnector.cs.Name the class QueueConnector.cs. Fare clic su Aggiungi per creare la classe.Click Add to create the class.
  3. Aggiungere ora codice che incapsula le informazioni di connessione e inizializza la connessione a una coda del bus di servizio.Now, add code that encapsulates the connection information and initializes the connection to a Service Bus queue. Sostituire l'intero contenuto di QueueConnector.cs con il codice seguente e immettere i valori per your Service Bus namespace, ovvero il nome dello spazio dei nomi, e yourKey, ovvero la chiave primaria ottenuta in precedenza dal portale di Azure.Replace the entire contents of QueueConnector.cs with the following code, and enter values for your Service Bus namespace (your namespace name) and yourKey, which is the primary key you previously obtained from the Azure portal.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Microsoft.ServiceBus.Messaging;
    using Microsoft.ServiceBus;
    
    namespace FrontendWebRole
    {
        public static class QueueConnector
        {
            // Thread-safe. Recommended that you cache rather than recreating it
            // on every request.
            public static QueueClient OrdersQueueClient;
    
            // Obtain these values from the portal.
            public const string Namespace = "your Service Bus namespace";
    
            // The name of your queue.
            public const string QueueName = "OrdersQueue";
    
            public static NamespaceManager CreateNamespaceManager()
            {
                // Create the namespace manager which gives you access to
                // management operations.
                var uri = ServiceBusEnvironment.CreateServiceUri(
                    "sb", Namespace, String.Empty);
                var tP = TokenProvider.CreateSharedAccessSignatureTokenProvider(
                    "RootManageSharedAccessKey", "yourKey");
                return new NamespaceManager(uri, tP);
            }
    
            public static void Initialize()
            {
                // Using Http to be friendly with outbound firewalls.
                ServiceBusEnvironment.SystemConnectivity.Mode =
                    ConnectivityMode.Http;
    
                // Create the namespace manager which gives you access to
                // management operations.
                var namespaceManager = CreateNamespaceManager();
    
                // Create the queue if it does not exist already.
                if (!namespaceManager.QueueExists(QueueName))
                {
                    namespaceManager.CreateQueue(QueueName);
                }
    
                // Get a client to the queue.
                var messagingFactory = MessagingFactory.Create(
                    namespaceManager.Address,
                    namespaceManager.Settings.TokenProvider);
                OrdersQueueClient = messagingFactory.CreateQueueClient(
                    "OrdersQueue");
            }
        }
    }
    
  4. Assicurarsi che venga chiamato il metodo Initialize.Now, ensure that your Initialize method gets called. In Esplora soluzioni fare doppio clic su Global.asax\Global.asax.cs.In Solution Explorer, double-click Global.asax\Global.asax.cs.
  5. Aggiungere la riga di codice seguente alla fine del metodo Application_Start.Add the following line of code at the end of the Application_Start method.

    FrontendWebRole.QueueConnector.Initialize();
    
  6. Verrà infine aggiornato il codice Web creato in precedenza, in modo da inviare elementi alla coda.Finally, update the web code you created earlier, to submit items to the queue. In Esplora soluzioni fare doppio clic su Controllers\HomeController.cs.In Solution Explorer, double-click Controllers\HomeController.cs.
  7. Aggiornare il metodo Submit(), ovvero l'overload che non accetta parametri, come indicato di seguito per ottenere il numero di messaggi per la coda.Update the Submit() method (the overload that takes no parameters) as follows to get the message count for the queue.

    public ActionResult Submit()
    {
        // Get a NamespaceManager which allows you to perform management and
        // diagnostic operations on your Service Bus queues.
        var namespaceManager = QueueConnector.CreateNamespaceManager();
    
        // Get the queue, and obtain the message count.
        var queue = namespaceManager.GetQueue(QueueConnector.QueueName);
        ViewBag.MessageCount = queue.MessageCount;
    
        return View();
    }
    
  8. Aggiornare il metodo Submit(OnlineOrder order), ovvero l'overload che accetta un parametro, come indicato di seguito per inviare alla coda le informazioni relative all'ordine.Update the Submit(OnlineOrder order) method (the overload that takes one parameter) as follows to submit order information to the queue.

    public ActionResult Submit(OnlineOrder order)
    {
        if (ModelState.IsValid)
        {
            // Create a message from the order.
            var message = new BrokeredMessage(order);
    
            // Submit the order.
            QueueConnector.OrdersQueueClient.Send(message);
            return RedirectToAction("Submit");
        }
        else
        {
            return View(order);
        }
    }
    
  9. È ora possibile eseguire di nuovo l'applicazione.You can now run the application again. Ogni volta che si invia un ordine, il conteggio dei messaggi aumenta.Each time you submit an order, the message count increases.

Creare il ruolo di lavoroCreate the worker role

Verrà ora creato il ruolo di lavoro che elabora l'invio dell'ordine.You will now create the worker role that processes the order submissions. In questo esempio viene usato il modello di progetto Worker Role with Service Bus Queue di Visual Studio.This example uses the Worker Role with Service Bus Queue Visual Studio project template. Le credenziali necessarie sono già state ottenute dal portale.You already obtained the required credentials from the portal.

  1. Assicurarsi che Visual Studio sia connesso all'account Azure.Make sure you have connected Visual Studio to your Azure account.
  2. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sulla cartella Roles nel progetto MultiTierApp.In Visual Studio, in Solution Explorer right-click the Roles folder under the MultiTierApp project.
  3. Fare clic su Aggiungi, quindi su Nuovo progetto di ruolo di lavoro.Click Add, and then click New Worker Role Project. Viene visualizzata la finestra di dialogo Aggiungi nuovo progetto di ruolo.The Add New Role Project dialog box appears.

  4. Nella finestra di dialogo Aggiungi nuovo progetto di ruolo fare clic su Worker Role with Service Bus Queue.In the Add New Role Project dialog box, click Worker Role with Service Bus Queue.

  5. Nella casella Nome assegnare il nome OrderProcessingRole.In the Name box, name the project OrderProcessingRole. Fare quindi clic su Aggiungi.Then click Add.
  6. Copiare negli Appunti la stringa di connessione ottenuta nel passaggio 9 della sezione "Creare uno spazio dei nomi del bus di servizio".Copy the connection string that you obtained in step 9 of the "Create a Service Bus namespace" section to the clipboard.
  7. In Esplora soluzioni fare clic con il pulsante destro del mouse sul ruolo OrderProcessingRole creato nel passaggio 5. Assicurarsi di fare clic con il pulsante destro del mouse su OrderProcessingRole in Ruoli e non sulla classe.In Solution Explorer, right-click the OrderProcessingRole you created in step 5 (make sure that you right-click OrderProcessingRole under Roles, and not the class). Fare quindi clic su Proprietà.Then click Properties.
  8. Nella scheda Impostazioni della finestra di dialogo Proprietà posizionare il cursore all'interno della casella Valore per Microsoft.ServiceBus.ConnectionString, quindi incollare il valore dell'endpoint copiato al passaggio 6.On the Settings tab of the Properties dialog box, click inside the Value box for Microsoft.ServiceBus.ConnectionString, and then paste the endpoint value you copied in step 6.

  9. Creare una classe OnlineOrder che rappresenti gli ordini elaborati dalla coda.Create an OnlineOrder class to represent the orders as you process them from the queue. È possibile riutilizzare una classe creata in precedenza.You can reuse a class you have already created. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla classe OrderProcessingRole. È necessario fare clic con il pulsante destro del mouse sull'icona della classe, non sul ruolo.In Solution Explorer, right-click the OrderProcessingRole class (right-click the class icon, not the role). Fare clic su Aggiungi, quindi su Elemento esistente.Click Add, then click Existing Item.
  10. Selezionare la sottocartella per FrontendWebRole\Modelse fare doppio clic su OnlineOrder.cs per aggiungerlo al progetto corrente.Browse to the subfolder for FrontendWebRole\Models, and then double-click OnlineOrder.cs to add it to this project.
  11. In WorkerRole.cs modificare il valore della variabile QueueName da "ProcessingQueue" in "OrdersQueue" come illustrato nel codice seguente.In WorkerRole.cs, change the value of the QueueName variable from "ProcessingQueue" to "OrdersQueue" as shown in the following code.

    // The name of your queue.
    const string QueueName = "OrdersQueue";
    
  12. Aggiungere l'istruzione using seguente all'inizio del file WorkerRole.cs.Add the following using statement at the top of the WorkerRole.cs file.

    using FrontendWebRole.Models;
    
  13. Nella funzione Run(), all'interno della chiamata OnMessage(), sostituire il contenuto della clausola try con il codice seguente.In the Run() function, inside the OnMessage() call, replace the contents of the try clause with the following code.

    Trace.WriteLine("Processing", receivedMessage.SequenceNumber.ToString());
    // View the message as an OnlineOrder.
    OnlineOrder order = receivedMessage.GetBody<OnlineOrder>();
    Trace.WriteLine(order.Customer + ": " + order.Product, "ProcessingMessage");
    receivedMessage.Complete();
    
  14. L'applicazione è stata completata.You have completed the application. È possibile testare l'applicazione completa facendo clic con il pulsante destro del mouse sul progetto MultiTierApp in Esplora soluzioni. Selezionare quindi Imposta come progetto di avvio e premere F5.You can test the full application by right-clicking the MultiTierApp project in Solution Explorer, selecting Set as Startup Project, and then pressing F5. Il numero totale dei messaggi non aumenta perché il ruolo di lavoro elabora gli elementi dalla coda e li contrassegna come completati.Note that the message count does not increment, because the worker role processes items from the queue and marks them as complete. È possibile verificare l'output di traccia del ruolo di lavoro visualizzando l'interfaccia utente dell'emulatore di calcolo di Azure.You can see the trace output of your worker role by viewing the Azure Compute Emulator UI. Per eseguire questa operazione, fare clic con il pulsante destro del mouse sull'icona dell'emulatore nell'area di notifica della barra delle applicazioni, quindi scegliere Show Compute Emulator UI (Mostra interfaccia utente dell'emulatore di calcolo).You can do this by right-clicking the emulator icon in the notification area of your taskbar and selecting Show Compute Emulator UI.

Passaggi successiviNext steps

Per ulteriori informazioni sul bus di servizio, vedere le risorse seguenti:To learn more about Service Bus, see the following resources:

Per altre informazioni sugli scenari multilivello, vedere:To learn more about multi-tier scenarios, see: