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
- Visual Studio 2013
- API Web 2
- Azure SDK per .NET 2.3
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.
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.
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.
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à.
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.
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
.
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.
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:
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.
Se non si è connessi all'account Azure, fare clic su Accedi.
Dopo aver eseguito l'accesso, scegliere una sottoscrizione e fare clic su Avanti.
Immettere un nome per il servizio cloud e scegliere un'area. Fare clic su Crea.
Fare clic su Pubblica.