SlideShare una empresa de Scribd logo
1 de 46
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

Más contenido relacionado

La actualidad más candente

Async/Await: make it simple!!
Async/Await: make it simple!!Async/Await: make it simple!!
Async/Await: make it simple!!Massimo Bonanni
 
Training Signal Webtrends
Training Signal WebtrendsTraining Signal Webtrends
Training Signal WebtrendsStefano Iaboni
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreManuel Scapolan
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
 
Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-templateDotNetCampus
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Manuel Scapolan
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationAntonio Liccardi
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-maxDotNetCampus
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiAndrea Dottor
 
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEDotNetCampus
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...Andrea Balducci
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationDotNetCampus
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 
Christmas greetings cards with blazor
Christmas greetings cards with blazorChristmas greetings cards with blazor
Christmas greetings cards with blazorNicolò Carandini
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroAndrea Dottor
 
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote ItalyMarco Parenzan
 
Wasm and Blazor CDays keynote
Wasm and Blazor CDays keynoteWasm and Blazor CDays keynote
Wasm and Blazor CDays keynoteNicolò Carandini
 
Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Michele Aponte
 

La actualidad más candente (20)

jQuery
jQueryjQuery
jQuery
 
Async/Await: make it simple!!
Async/Await: make it simple!!Async/Await: make it simple!!
Async/Await: make it simple!!
 
Training Signal Webtrends
Training Signal WebtrendsTraining Signal Webtrends
Training Signal Webtrends
 
AntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatoreAntiPatterns: i vizi del programmatore
AntiPatterns: i vizi del programmatore
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql Server
 
Dot netcampus2015 green-template
Dot netcampus2015 green-templateDot netcampus2015 green-template
Dot netcampus2015 green-template
 
Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)Managed Extensibility Framework (MEF)
Managed Extensibility Framework (MEF)
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 
Del furia signalr-to-the-max
Del furia   signalr-to-the-maxDel furia   signalr-to-the-max
Del furia signalr-to-the-max
 
ASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivatiASP.NET Core - dove siamo arrivati
ASP.NET Core - dove siamo arrivati
 
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
 
Wcf data services
Wcf data servicesWcf data services
Wcf data services
 
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
[Alam aeki] Guida illustrata alla modellazione di un dominio con Event Sourci...
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 
Christmas greetings cards with blazor
Christmas greetings cards with blazorChristmas greetings cards with blazor
Christmas greetings cards with blazor
 
ASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuroASP.NET MVC 6 - uno sguardo al futuro
ASP.NET MVC 6 - uno sguardo al futuro
 
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
 
Wasm and Blazor CDays keynote
Wasm and Blazor CDays keynoteWasm and Blazor CDays keynote
Wasm and Blazor CDays keynote
 
Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021Intelligenza artificiale nel mondo front-end - CodeGen2021
Intelligenza artificiale nel mondo front-end - CodeGen2021
 

Similar a Web Api – The HTTP Way

Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)brossi676
 
Spring Framework
Spring FrameworkSpring Framework
Spring FrameworkNaLUG
 
Microservices architecture & Service Fabric
Microservices architecture & Service FabricMicroservices architecture & Service Fabric
Microservices architecture & Service FabricMassimo Bonanni
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)Sabino Labarile
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09Francesco Ronchi
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAndrea Balducci
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimizationAndrea Dottor
 
Usare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulUsare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulLuca Milan
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTfirenze-gtug
 
ASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerManuel Scapolan
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)Sabino Labarile
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the WebClaudio Gandelli
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012Andrea Dottor
 
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applicationsDotNetCampus
 
SVILUPPO DI UNA SOLUZIONE SINGLE SIGN ON PER L’ENTE VENETO LAVORO
SVILUPPO DI UNA SOLUZIONE  SINGLE SIGN ON  PER L’ENTE VENETO LAVOROSVILUPPO DI UNA SOLUZIONE  SINGLE SIGN ON  PER L’ENTE VENETO LAVORO
SVILUPPO DI UNA SOLUZIONE SINGLE SIGN ON PER L’ENTE VENETO LAVOROZanatta Davide
 

Similar a Web Api – The HTTP Way (20)

Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)Yii Framework - yes it is rapid web application development (Parte 1)
Yii Framework - yes it is rapid web application development (Parte 1)
 
Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Spring Framework
Spring FrameworkSpring Framework
Spring Framework
 
MVC and Struts 1
MVC and Struts 1MVC and Struts 1
MVC and Struts 1
 
Microservices architecture & Service Fabric
Microservices architecture & Service FabricMicroservices architecture & Service Fabric
Microservices architecture & Service Fabric
 
SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)SUE AGILE Framework (Italiano)
SUE AGILE Framework (Italiano)
 
CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09CakePhp Linux Day Torino '09
CakePhp Linux Day Torino '09
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Usare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTfulUsare le nuove WCF Web Api per creare servizi RESTful
Usare le nuove WCF Web Api per creare servizi RESTful
 
ASP.NET MVC: Full Throttle
ASP.NET MVC: Full ThrottleASP.NET MVC: Full Throttle
ASP.NET MVC: Full Throttle
 
Niccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWTNiccolò Becchi: Introduzione a GWT
Niccolò Becchi: Introduzione a GWT
 
Introduzione a Struts
Introduzione a StrutsIntroduzione a Struts
Introduzione a Struts
 
ASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del ControllerASP.NET MVC3 - Tutti i compiti del Controller
ASP.NET MVC3 - Tutti i compiti del Controller
 
e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)e-SUAP - General software architecture (Italiano)
e-SUAP - General software architecture (Italiano)
 
Hands on MVC - Mastering the Web
Hands on MVC - Mastering the WebHands on MVC - Mastering the Web
Hands on MVC - Mastering the Web
 
What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012What's New in ASP.NET 4.5 and Visual Studio 2012
What's New in ASP.NET 4.5 and Visual Studio 2012
 
Cert03 70-486 developing asp.net mvc 4 web applications
Cert03   70-486 developing asp.net mvc 4 web applicationsCert03   70-486 developing asp.net mvc 4 web applications
Cert03 70-486 developing asp.net mvc 4 web applications
 
Virtual Agency
Virtual AgencyVirtual Agency
Virtual Agency
 
SVILUPPO DI UNA SOLUZIONE SINGLE SIGN ON PER L’ENTE VENETO LAVORO
SVILUPPO DI UNA SOLUZIONE  SINGLE SIGN ON  PER L’ENTE VENETO LAVOROSVILUPPO DI UNA SOLUZIONE  SINGLE SIGN ON  PER L’ENTE VENETO LAVORO
SVILUPPO DI UNA SOLUZIONE SINGLE SIGN ON PER L’ENTE VENETO LAVORO
 

Más de Luca Milan

Enabling DevOps for Machine Learning with Azure Pipelines
Enabling DevOps for Machine Learning with Azure PipelinesEnabling DevOps for Machine Learning with Azure Pipelines
Enabling DevOps for Machine Learning with Azure PipelinesLuca Milan
 
"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture
"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture
"Don't call us, we'll call you" - AngularJS meets Event-Driven ArchitectureLuca Milan
 
Azure WebSites for Developers
Azure WebSites for DevelopersAzure WebSites for Developers
Azure WebSites for DevelopersLuca Milan
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webLuca Milan
 
Il difficile mestiere dello sviluppatore: un approccio feature oriented.
Il difficile mestiere dello sviluppatore: un approccio feature oriented.Il difficile mestiere dello sviluppatore: un approccio feature oriented.
Il difficile mestiere dello sviluppatore: un approccio feature oriented.Luca Milan
 
What's new in Asp.Net 4.5 (and WebApi)
What's new in Asp.Net 4.5 (and WebApi)What's new in Asp.Net 4.5 (and WebApi)
What's new in Asp.Net 4.5 (and WebApi)Luca Milan
 
NHibernate Configuration Patterns
NHibernate Configuration PatternsNHibernate Configuration Patterns
NHibernate Configuration PatternsLuca Milan
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignLuca Milan
 

Más de Luca Milan (8)

Enabling DevOps for Machine Learning with Azure Pipelines
Enabling DevOps for Machine Learning with Azure PipelinesEnabling DevOps for Machine Learning with Azure Pipelines
Enabling DevOps for Machine Learning with Azure Pipelines
 
"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture
"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture
"Don't call us, we'll call you" - AngularJS meets Event-Driven Architecture
 
Azure WebSites for Developers
Azure WebSites for DevelopersAzure WebSites for Developers
Azure WebSites for Developers
 
AngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni webAngularJS – Reinventare le applicazioni web
AngularJS – Reinventare le applicazioni web
 
Il difficile mestiere dello sviluppatore: un approccio feature oriented.
Il difficile mestiere dello sviluppatore: un approccio feature oriented.Il difficile mestiere dello sviluppatore: un approccio feature oriented.
Il difficile mestiere dello sviluppatore: un approccio feature oriented.
 
What's new in Asp.Net 4.5 (and WebApi)
What's new in Asp.Net 4.5 (and WebApi)What's new in Asp.Net 4.5 (and WebApi)
What's new in Asp.Net 4.5 (and WebApi)
 
NHibernate Configuration Patterns
NHibernate Configuration PatternsNHibernate Configuration Patterns
NHibernate Configuration Patterns
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven Design
 

Web Api – The HTTP Way

  • 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.
  • 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à
  • 8.
  • 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.
  • 18. Single - Instance Multi - Instance  IActionValueBinder  IApiExplorer  IAssembliesResolver  IBodyModelValidator  IContentNegotiator  IDocumentationProvider  IHostBufferPolicySelector  IHttpActionInvoker  IHttpActionSelector  IHttpControllerActivator  IHttpControllerSelector  IHttpControllerTypeResolver  ITraceManager  ITraceWriter  IModelValidatorCache  IFilterProvider  ModelBinderProvider  ModelMetadataProvider  ModelValidatorProvider  ValueProviderFactory
  • 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)
  • 24. Come manipolare richiesta e risposta HTTP tramite message handlers
  • 27. Possiamo debuggare le regole di routing:  Tramite il componente nuget: http://www.nuget.org/packages/WebApiRouteDebugg er/  PM> Install-Package WebApiRouteDebugger
  • 28. Come funziona il routing basato sui verbi Http
  • 29.
  • 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
  • 34. Verrà illustrato come agisco i filtri all’interno del blocco controller.
  • 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.
  • 44. Esecuzione asincrona delle Action sul Controller se il tipo ritornato dal metodo è Task o Task<T>
  • 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