4. 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
5. 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!)
6. 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
7. E' uno stile architetturale (SOAP invece è un protocollo
basato su XML)
E’ stato discusso nel 2000 da Roy Fielding
Buon Livello di Maturità
12. 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)
13. L’oggetto deputato alla configurazione è un singleton:
GlobalConfiguration.Configuration e contiene la sola istanza possibile della
classe HttpConfiguration.
14.
15. I settaggi sono contenuti nella classe HttpSelfHostConfiguration che deriva
da HttpConfiguration.
16. Come hostare una webapi all’interno
di una console application e vivere
felici
17. 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.
20. 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
21. Per usare la configurazione per controller è necessario creare
un attributo che erediti dall’interfaccia IControllerConfiguration:
22. 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;
}
23. 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)
27. Possiamo debuggare le regole di routing:
Tramite il componente nuget:
http://www.nuget.org/packages/WebApiRouteDebugg
er/
PM> Install-Package WebApiRouteDebugger
30. 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
31.
32. 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.
33. 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
35. 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
36. 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.
37. Come creare dei bindings custom
per i parametri delle actions
38. 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;
39. 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.
40. Come creare un formatter custom
per rappresentare una risorsa in
formato CSV
41. 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
43. 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.
45. 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
46. 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