Web Api – The HTTP Way
-
Upload
luca-milan -
Category
Technology
-
view
373 -
download
4
Transcript of Web Api – The HTTP Way
Web Api – The HTTP Way
Intro REST Style Pipeline Configuration Host Routing Controllers / Action Action Filters Message Handlers Content Negotation Dependency Injection Roadmap:
http://aspnetwebstack.codeplex.com/wikipage?title=Roadmap
Agenda
I pilastri per lo sviluppo Web
Framework per lo Sviluppo ed il Consumo di servizi HTTP (RestFul e non solo...);
Creata seguendo principi di programmazione AGILI e SOLIDI => Ortogonalità, Estensibilità;
Trasforma il protocollo l'HTTP in una piattaforma di programmazione.
E’ una api Simmetrica (parte Server / Client) E’ Open Source
http://aspnetwebstack.codeplex.com
Cos’è ?
Riutilizza meccanismi tipici di ASP.NET MVC quali: Routing, Model Binder e Filtri (Pre e Post esecuzione)
Pensata con un approccio FRICTION-LESS (Zero-Configuration, Registry Pattern)
Sfrutta il paradigma Convention Over Configuration (Auto selezione di Formatters / Http Headers e Mapping delle Action / Http Verbs)
Ricca di punti di estensibilità (Controller Activator, Message Handler, Filters, Tracing, Logging)
Realmente Asyncrona (nessuna scusa!)
I vantaggi
Nel modello ad oggetti di webapi esistono 3 astrazioni fondamentali che la rendono fruibile lato server e lato client (Api Simmetrica):
HttpRequestMessage HttpResponseMessage HttpMessageHandler
Catena di Trasformazione della Richiesta (bidirezionale, asincrona)
Good Design: astrazioni
HANDLER …
HANDLER 2
HANDLER 1
Richiesta Risposta
E' uno stile architetturale (SOAP invece è un protocollo basato su XML)
E’ stato discusso nel 2000 da Roy Fielding Buon Livello di Maturità
REpresentational State Transfer
REST: HTTP != RPC
Prima di Web Api nel mondo .NET non erano molte le alternative per sviluppare servizi REST:◦Open.RASTA◦ Service.Stack◦ASP.NET MVC◦WCF RestToolkit
Usare WCF per approcciare REST è possibile ma macchinoso (es. configurazione complessa) e poco flessibile (assenza di un meccanismo di ROUTING per le URL);
REST con il framework .NET
WebApi «Building Blocks»CONTROLLER
PIPELINE (HANDLERS)
HOST
WebApi può essere ospitata in 3 modi differenti:1. Self Hosting (bastato su WCF ottima per Console
Application o Windows Service)2. WebHosting (basato su ASP.NET / IIS)3. OWIN( basato su progetto Katana)
Tutte le soluzioni hanno in comune la classe HttpConfiguration che ha il compito di configurare il framework in ogni suo aspetto;
Blocco Host
Sono possibili vari livelli di configurazione su cui agire:
Livello Globale1. Con ASP.NET Web Hosting
Assembly System.Web.Http.WebHost
2. Con Self-Hosting Assembly System.Web.Http.SelfHost
Livello dei Servizi Livello Controller (per controller)
Configurazione Flessibile
L’oggetto deputato alla configurazione è un singleton: GlobalConfiguration.Configuration e contiene la sola istanza possibile della classe HttpConfiguration.
Configurazione: ASP.NET Hosting
Configurazione: ASP.NET Hosting
Configurazione Self HostingI settaggi sono contenuti nella classe HttpSelfHostConfiguration che deriva da HttpConfiguration.
DEMO SELF HOSTEDCome hostare una webapi all’interno di una console application e vivere felici
Implementato tramite un Registry Pattern, contiene tutti i «TIPI NOTI» al framework in termini di Servizi; Un tipo può essere sostituito o aggiunto in fase di warmup dell’applicazione.
Configuration: Services
Single-Instance:
Multi-Instance:
Configuration: Services
Single - Instance Multi - Instance
IActionValueBinder IApiExplorer IAssembliesResolver IBodyModelValidator IContentNegotiator IDocumentationProvider IHostBufferPolicySelector IHttpActionInvoker IHttpActionSelector IHttpControllerActivator IHttpControllerSelector IHttpControllerTypeResolver ITraceManager ITraceWriter IModelValidatorCache
IFilterProvider ModelBinderProvider ModelMetadataProvider ModelValidatorProvider ValueProviderFactory
DEMO SERVIZIImplementare IHttpControllerTypeResolvere IHttpControllerActivator
Oltre che a livello globale alcune impostazioni possono essere cambiate a livello (locale) per singolo Controller tramite un meccanismo di «override».
E’ possibile cambiare i seguenti settings:◦Media-Type formatters◦Parameter Binding Rules◦Services
Configuration: Per-Controller
Per usare la configurazione per controller è necessario creare un attributo che erediti dall’interfaccia IControllerConfiguration:
Configuration: Per-Controller
Blocco Message Handlers
protected Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){ //intercetto la richiesta e lavoro su un valore dell’header var requestDate = request.Headers.Date; //eseguo la richesta e ottengo la risposta dal blocco controller var response = await base.SendAsync(request, cancellationToken); //manipolo la risposta e lavoro su un valore dell’header var responseDate = response.Headers.Date; //chiudo e restituisco la risposta return response;}
Esisto 2 tipi di handlers◦ Built-IN◦ Custom (scriviamo noi)
Gli ultimi 2 handlerssi occupano di girare la richiesta al controller oppurtuno in base al meccanismo di routing;
Gli handlers possono essere registrati a livello:◦ Globale (in Configuration)◦ Per Route (su template route)
Catena di lavoro
DEMO Message HandlersCome manipolare richiesta e risposta HTTP tramite message handlers
Permette di mappare un controller con una risorsa e i suoi metodi con i verbi http (get, post, put, options, head, delete, patch):
template: api/{controller}/{id}
Per i metodi possiamo usare gli attributi AcceptVerbs, HttpPost, HttpGet, ecc...
Possiamo personalizzare il routing con defaults e constraints come in MVC.
Per tutte le azioni il cui nome non combacia con un verbo http , il default è il verbo POST
Routing - Guidato dai verbi Http
Permette di mappare le actions del controller con dei nomi che non sono collegati strettamente collegati ai verbi http:
template: services/{controller}/{action}/{id}
Ricordiamo che la regola d’oro nella valutazione delle routes è «First Win». Quindi la posizione in cui mettiamo le routes è importante.
Routing – Vecchio stile {action}
Possiamo debuggare le regole di routing:
Tramite il componente nuget: http://www.nuget.org/packages/WebApiRouteDebugger/
PM> Install-Package WebApiRouteDebugger
Routing - Debugging
DEMO ROUTINGCome funziona il routing basato sui verbi Http
WebApi – Blocco Controller
Usa le stesse convenzioni di ASP.NET MVC Esempio: GET: api/{controller} => api/Book◦ Estrae dal dizionario di routing il valore per la chiave
{controller}: «Book»◦ Appende la parola «Controller» al valore trovato:
«BookController»◦ Cerca tra i tipi candidati quello corrispondente al nome
trovato; Possiamo cambiare questa convenzione in base alle
nostre esigenze vedi IHttpControllerTypeResolver
Selezione del Controller
Selezione delle Actions
Sono ideali per gestire i «cross cutting concerns»: sicurezza, logging, transazionalità, validazione, mapping, ecc..Esistono vari tipi di filtri:1. Authorization Filters: vengono eseguiti prima del
ModelBinding (verifica identità, autorizzazione, check sicurezza)
2. Action Filters: vengono eseguiti prima e dopo l’invocazione di una action (ispezione request/response)
3. Exception Filters: vengono eseguiti quando si sollevano errori nel «Blocco Controllers»
I filtri possono essere configurati a livello di Configurazione, Per-Controller o Per-Action.
Action Filters
1. I filtri sono asincroni per definizione, anche se per semplicità viene fornita una versione sincrona per ognuno di essi.
2. Non esiste un filtro [HandleError] come in MVC, in WebApi possiamo scrivere un filtro globale per personalizzare il comportamento di default.
3. Esistono sempre i filtri [AllowAnonymous] e [Autorize] per la gestione della sicurezza
Action Filters
DEMO FILTRIVerrà illustrato come agisco i filtri all’interno del blocco controller.
Il meccanismo di binding crea i tipi .NET corrispondenti ai parametri delle actions partendo dalla richiesta HTTP:◦ I tipi semplici (Guid, DateTime, String) dall’URI tramite Model
Binder◦ I tipi complessi dal Body tramite i MediaType Formatters
Questo comportamento può essere cambiato agendo su alcuni punti di estensibilità:◦ IActionValueBinder◦ HttpParameterBinding
Binding dei Parametri
Schema di Binding
URI
HEADERS
BODY TIPI COMPLESSI
TIPI SEMPLICI
Richiesta HTTPModelBinder
ValueProvider
Media Type Formatters
OGNI TIPO
HttpParameterBinding
WebApi può leggere il BODY della richiesta una sola volta, quindi non è possibile associare più di un parametro al body.
TIPO CLR
DEMO BINDING Come creare dei bindings custom per i parametri delle actions
E’ il processo di selezione della migliore rappresentazione di una risorsa in risposta ad una richiesta del client;
Il client può richiedere tramite l’header HTTP Accept-* la formattazione della risposta in uno specifico formato (Media Type);
Il framework riesce a gestire in modo automatico questa situazione per i formati Xml e Json, ma nulla ci vieta di creare dei MediaType personalizzati;
WebApi – Negoziazione del Contenuto
Sono i componenti che si occupano di serializzare / deserializzare una risorsa. Entrano in gioco:
1. Dopo la creazione del risultato della Action2. In fase di Binding per i tipi complessi agendo sul body della richiesta
per reidratare i parametri delle Action
I Formatters possono essere gestiti a livello di Configurazione oppure a livello del Controller.
Possiamo creare nuovi formatter ereditando dalle classi: MediaTypeFormatter o BufferedMediaTypeFormatter. La prima utilizza metodi asincroni di lettura e scrittura mentre la seconda supporta un approccio sincrono.
Formatters
DEMO MEDIA FORMATTERCome creare un formatter custom per rappresentare una risorsa in formato CSV
Presente già in MVC Evoluta in WebApi con IDependencyResolver e
IDependencyScope (per richiesta) Prima di instanziare un servizio WebApi chiede al
resolver se esiste, in caso contrario utilizza l’implementazione di default
Lifetime degli oggetti◦ I controllers vengono creati per ogni richiesta◦ I message handlers e i servizi una sola volta all’avvio
dell’applicazione
WebApi – Iniezione delle Dipendenze
DEMO IOCCome implementare un DependecyResolver custom
IIS possiede un numero finito di threads per soddisfare le richieste.Se ci sono richieste che impegnano a lungo il server si rischia il blocco del server perché i threads risultano impegnati.
WebApi – Aync by Design
503
Async by DesignEsecuzione asincrona delle Action sul Controller se il tipo ritornato dal metodo è Task o Task<T>
Possiamo usare i Templates di progetto di Visual Studio 2012 (MVC4 + WebApi)
WebApi: Setup di un progetto
Oppure essere più snelli, creando un web project vuoto per ASP.NET e con NUGET fare il setup da linea di comando:
PM> Install-Package Microsoft.AspNet.WebApi
La DotDotNet è un'associazione culturale con il compito di promuovere la più ampia diffusione dell'informatica, della telematica, della multimedialità e dei collaborative tools, con particolare attenzione allo sviluppo di software su piattaforma Microsoft .NET. (dall’art. 1 dello statuto DotDotNet)
Associazione no-profit◦ Opera in tutta la regione
Gruppo di professionisti, studenti e appassionati. Feedback Adesione:
http://dotdotnet.org/content/Adesione.aspx
User Group .NET Emilia-Romagna