Condividi tramite


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

di Mike Wasson

Questa esercitazione illustra come ospitare API Web ASP.NET 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 i server Web .NET e le applicazioni Web. OWIN separa l'applicazione Web dal server, che rende OWIN ideale per l'self-hosting 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 Azure e mostra il nome dell'app e l'opzione ruolo di lavoro sottostante.

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 di Esplora soluzioni, evidenziando i passaggi per selezionare le impostazioni delle proprietà del ruolo di lavoro.

Scegliere Endpoint, quindi fare clic su Aggiungi endpoint.

Nell'elenco a discesa Protocollo selezionare "http". In Porta pubblica e porta privata digitare 80. Questi numeri di porta possono essere diversi. La porta pubblica è ciò che i client usano 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 scegliere Aggiungi / classe per aggiungere una nuova classe. Denominare la classe Startup.

Screenshot della finestra esplora soluzioni, che mostra le opzioni di menu ed evidenzia il percorso per aggiungere 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 che viene eseguito all'avvio e all'arresto del ruolo di lavoro.

Aggiungere l'istruzione using seguente:

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.

Nota

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'assembly individuato non corrisponde al riferimento all'assembly. (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 dell'interfaccia utente dell'emulatore di calcolo di Azure, che mostra il menu e le informazioni sull'indirizzo dell'endpoint IP quando si seleziona l'opzione

Trovare l'indirizzo IP in Distribuzioni del servizio, distribuzione [id], Dettagli 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 I P Web dopo aver immesso l'indirizzo P assegnato dall'emulatore di calcolo.

Distribuisci in Azure

Per questo passaggio, è necessario disporre di un account Azure. Se non è già disponibile, è possibile creare un account di valutazione 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. Selezionare Pubblica.

Screenshot delle opzioni di menu della finestra esplora soluzioni, 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 'Pubblica applicazione Azure', che richiede un'opzione di accesso prima che altre opzioni diventino disponibili.

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

Screenshot dell'applicazione di Azure di pubblicazione 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. Fare clic 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