Condividi tramite


Ospitare ASP.NET'API Web 2 in un ruolo di lavoro di Azure

di Mike Wasson

Questa esercitazione illustra come ospitare ASP.NET'API Web in un ruolo di lavoro di Azure usando OWIN per ospitare autonomamente il framework API Web.

Open Web Interface for .NET (OWIN) definisce un'astrazione tra server Web .NET e applicazioni Web. OWIN separa l'applicazione Web dal server, che rende OWIN ideale per l'hosting automatico di un'applicazione Web nel proprio processo, all'esterno di IIS, ad esempio all'interno di un ruolo di lavoro di Azure.

In questa esercitazione si userà il pacchetto Microsoft.Owin.Host.HttpListener, che fornisce un server HTTP usato per ospitare applicazioni OWIN self-host.

Versioni software usate nell'esercitazione

Creare un progetto di Microsoft Azure

Avviare Visual Studio con privilegi di amministratore. I privilegi di amministratore sono necessari per eseguire il debug dell'applicazione in locale, usando l'emulatore di calcolo di Azure.

Scegliere Nuovo dal menu File, quindi fare clic su Progetto. In Modelli installati, in Visual C#, fare clic su Cloud e quindi su Servizio cloud di Windows Azure. Assegnare al progetto il nome "AzureApp" e fare clic su OK.

Screenshot della finestra di dialogo

Nella finestra di dialogo Nuovo servizio cloud di Windows Azure fare doppio clic su Ruolo di lavoro. Lasciare il nome predefinito ("WorkerRole1"). Questo passaggio aggiunge un ruolo di lavoro alla soluzione. Fare clic su OK.

Screenshot della finestra di dialogo

La soluzione di Visual Studio creata contiene due progetti:

  • "AzureApp" definisce i ruoli e la configurazione per l'applicazione Azure.
  • "WorkerRole1" contiene il codice per il ruolo di lavoro.

In generale, un'applicazione Azure può contenere più ruoli, anche se questa esercitazione usa un singolo ruolo.

Screenshot della finestra Esplora soluzioni, che evidenzia il nuovo progetto app di Azure e mostra l'opzione nome app e ruolo di lavoro sotto di essa.

Aggiungere l'API Web e i pacchetti OWIN

Scegliere Gestione pacchetti NuGet dal menu Strumenti, quindi fare clic su Console di Gestione pacchetti.

Nella finestra Console di Gestione pacchetti immettere il comando seguente:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

Aggiungere un endpoint HTTP

In Esplora soluzioni espandere il progetto AzureApp. Espandere il nodo Ruoli, fare clic con il pulsante destro del mouse su WorkerRole1 e scegliere Proprietà.

Screenshot del menu della finestra esplora soluzioni, evidenziando i passaggi per selezionare le impostazioni delle proprietà del ruolo di lavoro.

Fare clic su Endpoint e quindi su Aggiungi endpoint.

Nell'elenco a discesa Protocollo selezionare "http". In Porta Pubblica e Porta Privata, inserisci 80. Questi numeri di porta possono essere diversi. La porta pubblica è quella usata dai client quando inviano una richiesta al ruolo.

Screenshot delle opzioni del menu a discesa del protocollo che mostrano le diverse configurazioni del servizio e le opzioni degli endpoint.

Configurare l'API Web per Self-Host

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto WorkerRole1 e selezionare Aggiungi / classe per aggiungere una nuova classe. Assegnare alla classe Startupil nome .

Screenshot della finestra Esplora soluzioni, che mostra le opzioni di menu ed evidenzia il percorso per l'aggiunta di una classe.

Sostituire tutto il codice boilerplate in questo file con quanto segue:

using Owin;
using System.Web.Http;

namespace WorkerRole1
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                "Default",
                "{controller}/{id}",
                new { id = RouteParameter.Optional });

            app.UseWebApi(config);
        }
    }
}

Aggiungere un controller API Web

Aggiungere quindi una classe controller API Web. Fare clic con il pulsante destro del mouse sul progetto WorkerRole1 e scegliere Aggiungi / classe. Assegnare alla classe il nome TestController. Sostituire tutto il codice boilerplate in questo file con quanto segue:

using System;
using System.Net.Http;
using System.Web.Http;

namespace WorkerRole1
{
    public class TestController : ApiController
    {
        public HttpResponseMessage Get()
        {
            return new HttpResponseMessage()
            {
                Content = new StringContent("Hello from OWIN!")
            };
        }

        public HttpResponseMessage Get(int id)
        {
            string msg = String.Format("Hello from OWIN (id = {0})", id);
            return new HttpResponseMessage()
            {
                Content = new StringContent(msg)
            };
        }
    }
}

Per semplicità, questo controller definisce solo due metodi GET che restituiscono testo normale.

Avviare l'host OWIN

Aprire il file WorkerRole.cs. Questa classe definisce il codice eseguito all'avvio e all'arresto del ruolo di lavoro.

Aggiungere la seguente istruzione using:

using Microsoft.Owin.Hosting;

Aggiungere un membro IDisposable alla WorkerRole classe :

public class WorkerRole : RoleEntryPoint
{
    private IDisposable _app = null;

    // ....
}

OnStart Nel metodo aggiungere il codice seguente per avviare l'host:

public override bool OnStart()
{
    ServicePointManager.DefaultConnectionLimit = 12;

    // New code:
    var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
    string baseUri = String.Format("{0}://{1}", 
        endpoint.Protocol, endpoint.IPEndpoint);

    Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
        "Information");

    _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
    return base.OnStart();
}

Il metodo WebApp.Start avvia l'host OWIN. Il nome della Startup classe è un parametro di tipo per il metodo . Per convenzione, l'host chiamerà il Configure metodo di questa classe.

Eseguire l'override di OnStop per eliminare l'istanza di _app :

public override void OnStop()
{
    if (_app != null)
    {
        _app.Dispose();
    }
    base.OnStop();
}

Ecco il codice completo per WorkerRole.cs:

using Microsoft.Owin.Hosting;
using Microsoft.WindowsAzure.ServiceRuntime;
using System;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace WorkerRole1
{
    public class WorkerRole : RoleEntryPoint
    {
        private IDisposable _app = null;

        public override void Run()
        {
            Trace.TraceInformation("WebApiRole entry point called", "Information");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.TraceInformation("Working", "Information");
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"];
            string baseUri = String.Format("{0}://{1}", 
                endpoint.Protocol, endpoint.IPEndpoint);

            Trace.TraceInformation(String.Format("Starting OWIN at {0}", baseUri), 
                "Information");

            _app = WebApp.Start<Startup>(new StartOptions(url: baseUri));
           return base.OnStart();
        }

        public override void OnStop()
        {
            if (_app != null)
            {
                _app.Dispose();
            }
            base.OnStop();
        }
    }
}

Compilare la soluzione e premere F5 per eseguire l'applicazione in locale nell'emulatore di calcolo di Azure. A seconda delle impostazioni del firewall, potrebbe essere necessario consentire l'emulatore tramite il firewall.

Annotazioni

Se viene visualizzata un'eccezione simile alla seguente, vedere questo post di blog per una soluzione alternativa. "Impossibile caricare il file o l'assembly 'Microsoft.Owin, Version=2.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' o una delle relative dipendenze. La definizione del manifesto dell'assemblaggio individuato non corrisponde al riferimento all'assemblaggio. (Eccezione da HRESULT: 0x80131040)"

L'emulatore di calcolo assegna un indirizzo IP locale all'endpoint. È possibile trovare l'indirizzo IP visualizzando l'interfaccia utente dell'emulatore di calcolo. Fare clic con il pulsante destro del mouse sull'icona dell'emulatore nell'area di notifica della barra delle applicazioni e selezionare Mostra interfaccia utente dell'emulatore di calcolo.

Screenshot della UI di Azure Compute Emulator, che mostra il menu e le informazioni sull'indirizzo dell'endpoint IP, selezionando l'opzione

Trovare l'indirizzo IP in Distribuzioni di servizi, distribuzione [id], Dettagli del servizio. Aprire un Web browser e passare a http://address/test/1, dove indirizzo è l'indirizzo IP assegnato dall'emulatore di calcolo; ad esempio, http://127.0.0.1:80/test/1. Verrà visualizzata la risposta dal controller API Web:

Screenshot della finestra del browser che mostra la risposta del controller Web A P I dopo aver immesso l'indirizzo I P assegnato dall'emulatore di calcolo.

Distribuzione su Azure

Per questo passaggio, è necessario avere un account Azure. Se non ne hai già uno, puoi creare un account di prova gratuito in pochi minuti. Per informazioni dettagliate, vedere Versione di valutazione gratuita di Microsoft Azure.

In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto AzureApp. Seleziona Pubblica.

Screenshot della finestra Esplora soluzioni con le opzioni di menu, che evidenzia i passaggi da seguire per distribuire o pubblicare il progetto.

Se non si è connessi all'account Azure, fare clic su Accedi.

Screenshot della finestra di dialogo

Dopo aver eseguito l'accesso, scegliere una sottoscrizione e fare clic su Avanti.

Screenshot dell'applicazione di pubblicazione di Azure dopo l'accesso, che richiede all'utente di scegliere un tipo di sottoscrizione prima di continuare con il passaggio successivo.

Immettere un nome per il servizio cloud e scegliere un'area. Clicca su Crea.

Screenshot della finestra di dialogo

Fare clic su Pubblica.

Screenshot della finestra

Configurazione di un nome di dominio personalizzato per un servizio cloud di Azure (versione classica)

Risorse aggiuntive