Con ASP.NET 5 all'orizzonte (di recente è stata rilasciata la beta 8, l'ultima), diventa più impellente farsi trovare pronti per il rilascio ufficiale. Una delle novità è il supporto ad applicazioni web basate su OWIN. Quest'oggi cercheremo di capire di cosa si tratta e che implicazioni abbiano per noi sviluppatori.
OWIN è una specifica (http://owin.org) che descrive un'interfaccia standard per rendere un'applicazione web .NET disaccoppiata dal web server che la ospita. Un'applicazione web basata su OWIN, quindi, non è più legata ad IIS, ma può funzionare su un qualsiasi web server che sia conforme alla specifica. Questo apre scenari interessanti, come la possibilità di distribuire applicazioni su molteplici piattaforme, o di ospitarle in eseguibili secondo una modalità definita self-hosting.
A livello pratico, OWIN descrive un protocollo di comunicazione molto semplice: il web server e l'applicazione si scambiano informazioni attraverso un dizionario di tipo IDictionary
Tale dizionario è disponibile nell'applicazione web ai vari middleware, ovvero moduli operativi disposti in serie in una pipeline. Ciascuno di essi, dopo aver eseguito una propria logica, ha facoltà di invocare l'esecuzione del middleware immediatamente successivo, oppure di impedirne il proseguimento generando il contenuto della risposta.
I middleware possono avere complessità e responsabilità diversificate. Alcuni di essi sono creati per svolgere compiti trasversali, quali il logging o l'autorizzazione, mentre altri hanno il compito di generare il contenuto della risposta, sia esso prelevato da un file statico o frutto di un'elaborazione dinamica.
Nulla viene dato per scontato: in una pipeline OWIN sono presenti solo i middleware che lo sviluppatore vi configura. Questa rappresenta una sostanziale differenza rispetto allo sviluppo di applicazioni ASP.NET tradizionali, la cui pipeline era invece già popolata con alcuni HttpModule di uso comune, come ad esempio quelli inerenti alla Session e alla Forms Authentication, tra gli altri.
Lavorare con una pipeline OWIN ci fa guadagnare un controllo chirurgico sui componenti coinvolti nella nostra applicazione e questo ci permette di ottimizzarne le prestazioni.
Per iniziare a sperimentare con OWIN non dobbiamo attendere che ASP.NET 5 venga rilasciato ufficialmente. Infatti, possiamo provarlo sin da subito con ASP.NET Web API 2, che già da tempo può essere ospitato su web server OWIN-compliant.
Un esperimento interessante che possiamo compiere è quello di ospitare una Web API in un'applicazione console: in questo modo saremo in grado di distribuirla come file eseguibile e consumarla anche su PC privi di IIS.
Da Visual Studio 2015, iniziamo creando un progetto di tipo Applicazione Console per Windows.
Dalla Console di Gestione Pacchetti, lanciamo il seguente comando per ottenere la libreria (e relative dipendenze) che ci permetterà di preparare il nostro web server OWIN-compliant.
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
All'interno del progetto, creiamo una cartella chiamata Controllers ed aggiungiamo in essa una classe chiamata, ad esempio, CitiesController. Si tratta di un normale ApiController di ASP.NET Web API, del tutto simile a quello che avremmo in un'applicazione ASP.NET ospitata in IIS.
public class CitiesController : ApiController { public IEnumerable<string> Get() { //Restituisco dati staticamente a puro scopo esemplificativo return new[] { "Roma", "Milano", "Torino" }; } }
Ora creiamo la classe da cui il servizio di routing di ASP.NET Web API viene configurato come middleware nella pipeline OWIN.
Per convenzione, chiamiamo questa classe Startup. Visual Studio 2015 ci permette di aggiungerla sfruttando un template apposito, chiamato "Classe di avvio di OWIN".
public class Startup { public void Configuration(IAppBuilder appBuilder) { //Configuriamo la classica route di default HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute ( name: "Api", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); //Configuriamo il middleware di routing di ASP.NET Web API //nella pipeline OWIN della nostra applicazione appBuilder.UseWebApi(config); } }
L'interfaccia IAppBuilder definisce un metodo Use per configurare middleware nella pipeline. Tuttavia, a meno che non intendiamo scrivere middleware personalizzati, al suo posto useremo degli extension method appositi, come UseWebApi, atti a semplificare e rendere più leggibile la configurazione.
Non resta che predisporre l'avvio del web server dal metodo Main della nostra applicazione console. Per far ciò, usiamo il metodo generico WebApp.Start, indicando il nome della classe Startup come type parameter.
static void Main(string[] args) { // Il web server si metterà ascolto sulla porta TCP 5000 using (WebApp.Start<Startup>("http://localhost:5000/")) { Console.Write("Premi INVIO per teminare il programma..."); Console.ReadLine(); } }
Avviamo il debug dell'applicazione console e, da questo momento, siamo in grado di interrogare la nostra Web API inviando richieste all'indirizzo http://localhost:5000/api/cities. Come è prevedibile, l'applicazione risponderà elencando i nomi delle città.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare l'infinite scroll con QuickGrid in Blazor Server
Migliorare l'organizzazione delle risorse con Azure Policy
Utilizzare Copilot con Azure Cosmos DB
Testare l'invio dei messaggi con Event Hubs Data Explorer
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Filtering sulle colonne in una QuickGrid di Blazor
Utilizzare Container Queries nominali
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Generare la software bill of material (SBOM) in GitHub
Esportare ed analizzare le issue di GitHub con la CLI e GraphQL
Configurare lo startup di applicazioni server e client con .NET Aspire
I più letti di oggi
- Simulare Azure Cosmos DB in locale con Docker
- Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- .NET Conference Italia 2024 - Milano
- .NET Conference Italia 2023 - Milano e Online