luca.milan@dotdotnet.org
 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
 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
 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!)
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
 E' uno stile architetturale (SOAP invece è un protocollo
basato su XML)
 E’ stato discusso nel 2000 da Roy Fielding
 Buon Livello di Maturità

◦
◦
◦
◦

CONTROLLER
PIPELINE
(HANDLERS)
HOST

1.
2.
3.

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)
L’oggetto deputato alla configurazione è un singleton:
GlobalConfiguration.Configuration e contiene la sola istanza possibile della
classe HttpConfiguration.
I settaggi sono contenuti nella classe HttpSelfHostConfiguration che deriva
da HttpConfiguration.
Come 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.
Single - Instance Multi - Instance
 IActionValueBinder
 IApiExplorer
 IAssembliesResolver
 IBodyModelValidator
 IContentNegotiator
 IDocumentationProvider
 IHostBufferPolicySelector
 IHttpActionInvoker
 IHttpActionSelector
 IHttpControllerActivator
 IHttpControllerSelector
 IHttpControllerTypeResolver
 ITraceManager
 ITraceWriter
 IModelValidatorCache
 IFilterProvider
 ModelBinderProvider
 ModelMetadataProvider
 ModelValidatorProvider
 ValueProviderFactory
Implementare
IHttpControllerTypeResolver
e 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
Per usare la configurazione per controller è necessario creare
un attributo che erediti dall’interfaccia IControllerConfiguration:
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 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)
Come manipolare richiesta e
risposta HTTP tramite message
handlers






Possiamo debuggare le regole di routing:
 Tramite il componente nuget:
http://www.nuget.org/packages/WebApiRouteDebugg
er/
 PM> Install-Package WebApiRouteDebugger
Come funziona il routing basato sui
verbi Http
 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
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.
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
Verrà 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
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.
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;
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.
Come 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
Come 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.
Esecuzione 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)
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

Web Api – The HTTP Way

  • 1.
  • 2.
     Intro  RESTStyle  Pipeline  Configuration  Host  Routing  Controllers / Action  Action Filters  Message Handlers  Content Negotation  Dependency Injection  Roadmap: http://aspnetwebstack.codeplex.com/wikipage?title=Roadmap
  • 4.
     Framework perlo 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 meccanismitipici 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 adoggetti 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' unostile architetturale (SOAP invece è un protocollo basato su XML)  E’ stato discusso nel 2000 da Roy Fielding  Buon Livello di Maturità
  • 9.
  • 10.
  • 11.
  • 12.
    Sono possibili varilivelli 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 allaconfigurazione è un singleton: GlobalConfiguration.Configuration e contiene la sola istanza possibile della classe HttpConfiguration.
  • 15.
    I settaggi sonocontenuti nella classe HttpSelfHostConfiguration che deriva da HttpConfiguration.
  • 16.
    Come hostare unawebapi all’interno di una console application e vivere felici
  • 17.
    Implementato tramite unRegistry 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.
  • 18.
    Single - InstanceMulti - Instance  IActionValueBinder  IApiExplorer  IAssembliesResolver  IBodyModelValidator  IContentNegotiator  IDocumentationProvider  IHostBufferPolicySelector  IHttpActionInvoker  IHttpActionSelector  IHttpControllerActivator  IHttpControllerSelector  IHttpControllerTypeResolver  ITraceManager  ITraceWriter  IModelValidatorCache  IFilterProvider  ModelBinderProvider  ModelMetadataProvider  ModelValidatorProvider  ValueProviderFactory
  • 19.
  • 20.
    Oltre che alivello 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 laconfigurazione per controller è necessario creare un attributo che erediti dall’interfaccia IControllerConfiguration:
  • 22.
    protected Task<HttpResponseMessage> SendAsync(HttpRequestMessagerequest, 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 2tipi 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)
  • 24.
    Come manipolare richiestae risposta HTTP tramite message handlers
  • 25.
  • 26.
  • 27.
    Possiamo debuggare leregole di routing:  Tramite il componente nuget: http://www.nuget.org/packages/WebApiRouteDebugg er/  PM> Install-Package WebApiRouteDebugger
  • 28.
    Come funziona ilrouting basato sui verbi Http
  • 30.
     Usa lestesse 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
  • 32.
    Sono ideali pergestire 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 filtrisono 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
  • 34.
    Verrà illustrato comeagisco i filtri all’interno del blocco controller.
  • 35.
     Il meccanismodi 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 TIPISEMPLICI 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 deibindings custom per i parametri delle actions
  • 38.
     E’ ilprocesso 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 componentiche 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 unformatter 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
  • 42.
  • 43.
    IIS possiede unnumero 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.
  • 44.
    Esecuzione asincrona delleAction sul Controller se il tipo ritornato dal metodo è Task o Task<T>
  • 45.
    Possiamo usare iTemplates 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