Web Api – The HTTP Way

599 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
599
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
18
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Web Api – The HTTP Way

  1. 1. luca.milan@dotdotnet.org
  2. 2.  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
  3. 3.  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
  4. 4.  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!)
  5. 5. 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) HANDLER … HANDLER 2 HANDLER 1 Richiesta Risposta
  6. 6.  E' uno stile architetturale (SOAP invece è un protocollo basato su XML)  E’ stato discusso nel 2000 da Roy Fielding  Buon Livello di Maturità
  7. 7.  ◦ ◦ ◦ ◦ 
  8. 8. CONTROLLER PIPELINE (HANDLERS) HOST
  9. 9.  1. 2. 3. 
  10. 10. Sono possibili vari livelli di configurazione su cui agire:  Livello Globale 1. 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)
  11. 11. L’oggetto deputato alla configurazione è un singleton: GlobalConfiguration.Configuration e contiene la sola istanza possibile della classe HttpConfiguration.
  12. 12. I settaggi sono contenuti nella classe HttpSelfHostConfiguration che deriva da HttpConfiguration.
  13. 13. Come hostare una webapi all’interno di una console application e vivere felici
  14. 14. 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.
  15. 15. Single - Instance Multi - Instance  IActionValueBinder  IApiExplorer  IAssembliesResolver  IBodyModelValidator  IContentNegotiator  IDocumentationProvider  IHostBufferPolicySelector  IHttpActionInvoker  IHttpActionSelector  IHttpControllerActivator  IHttpControllerSelector  IHttpControllerTypeResolver  ITraceManager  ITraceWriter  IModelValidatorCache  IFilterProvider  ModelBinderProvider  ModelMetadataProvider  ModelValidatorProvider  ValueProviderFactory
  16. 16. Implementare IHttpControllerTypeResolver e IHttpControllerActivator
  17. 17. 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
  18. 18. Per usare la configurazione per controller è necessario creare un attributo che erediti dall’interfaccia IControllerConfiguration:
  19. 19. 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; }
  20. 20.  Esisto 2 tipi di handlers ◦ Built-IN ◦ Custom (scriviamo noi)  Gli ultimi 2 handlers si 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)
  21. 21. Come manipolare richiesta e risposta HTTP tramite message handlers
  22. 22.    
  23. 23.  
  24. 24. Possiamo debuggare le regole di routing:  Tramite il componente nuget: http://www.nuget.org/packages/WebApiRouteDebugg er/  PM> Install-Package WebApiRouteDebugger
  25. 25. Come funziona il routing basato sui verbi Http
  26. 26.  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
  27. 27. 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.
  28. 28. 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
  29. 29. Verrà illustrato come agisco i filtri all’interno del blocco controller.
  30. 30.  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
  31. 31. URI HEADERS BODY TIPI COMPLESSI TIPI SEMPLICI ModelBinder 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.
  32. 32. Come creare dei bindings custom per i parametri delle actions
  33. 33.  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;
  34. 34. Sono i componenti che si occupano di serializzare / deserializzare una risorsa. Entrano in gioco: 1. Dopo la creazione del risultato della Action 2. 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.
  35. 35. Come creare un formatter custom per rappresentare una risorsa in formato CSV
  36. 36.  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
  37. 37. Come implementare un DependecyResolver custom
  38. 38. 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.
  39. 39. Esecuzione asincrona delle Action sul Controller se il tipo ritornato dal metodo è Task o Task<T>
  40. 40. Possiamo usare i Templates di progetto di Visual Studio 2012 (MVC4 + WebApi) 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
  41. 41.  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

×