What's new in Asp.Net 4.5 (and WebApi)

Preview:

Citation preview

Novità in ASP.NET 4.5Igor Antonacci – DotDotNet MemberLuca Milan – DotDotNet Member

• DotDotNet Member

• Sviluppatore .NET a tutto “tondo”

• Twitter: @fewbit

• Email: luca.milan@dotdotnet.org

Luca Milan

Agenda Cos’è ASP.NET 4.5

Le principali features in ASP.NET Web Forms 4.5

ASP.NET WebApi Framework (Big NEWS!)

Cos’è ASP.NET 4.5 Common Core Library

Web Forms 4.5 + MVC4 + Web Api Il nuovo Visual Studio 2012 Sotto-insieme di feature comuni per le due piattaforme In Place-Upgrade (sostituisce, aggiungendo funzionalità alla

precedente versione)

ASP.NET 4.5 Core

Web Forms 4.5 MVC 4 WEB API

Dove la cartella v4.5xxx?

<compilation debug="true" targetFramework="4.5"/>

<compilation debug="true" targetFramework="4.0"/>

Novità Visual Studio 2012

1. Page Inspector (Debug pagine web da VS)2. Supporto pieno ad HTLM5 (nuovi tag e

attributi)3. Smart Tag in modalità source (non solo desing)4. Intellisense avanzato per Javascript (goto

definition, references file unico, filtro per tipo dato…)

5. Supporto CSS3 (identazione gerarchica dei selettori, color picker embedded, snippets…)

6. «Extract to UserControl» per portare fuori il codice di un controllo da una pagina web

Novità principali di ASP.NET 4.5 Supporto all’Async (TPL / async – await)

Accesso asincrono ai Request – Response Stream Supporto async ai Moduli Http (HttpModules) Supporto async agli Handler Http (HttpHandlers)

Lazy Validation (ACHTUNG!) Anti-XSS Encoder Built-In Bundling & Minification

Async (Task Based) HttpModules (1) Utilizzano le TPL / async – await di C# 5 Utilizzano il pattern async per l’esecuzione di «task» di lunga durata (accesso risorse SO, chiamate WS)

Si utilizza l’helper class EventHandlerTaskAsyncHelper per la sottoscrizione …Async agli eventi della PipelineAddOn[EventNameXXX]Async(BeginEvent,EndEvent)

La scalabilità delle applicazioni aumenta (I thread vengono liberati e riutilizzati per altre richieste)

Async (Task Based) HttpModules (2)

Async Handlers (1) Si eredita da una classe base HttpTaskAsyncHandler (invece dell’interfaccia IHttpHandler)

Si fa l’override di ProcessRequestAsync

Async Handlers (2)

Demo – Async HTTPModules ed Handlers

Lazy Validation ASP.NET (<=4.0) verifica ciò che arriva tramite Headers, cookies, query string, FORM DATA per evitare «malicious code» (potenzialmente pericoloso)

La validazione avviene PRIMA che scatti la Pipeline e tramite una eccezione

ASP.NET 4.5 valida SOLO nel momento in cui ci accediamo

Dati non validati sono accessibili via Request.Unvalidated.Form[“…"]

Attivabile tramite Web.Config<httpRuntime requestValidationMode="4.5" />

Anti-Xss Encoder Supporto nativo all’encoding della libreria AntiXss

Si abilita tramite web.config<httpRuntime targetFramework="4.5“ encoderType="System.Web.Security.AntiXss.AntiXssEncoder"/>

Esegue l’encoding AntiXSS con i metodiHtmlEncode, HtmlFormUrlEncode, and HtmlAttributeEncodeXmlAttributeEncode and XmlEncodeUrlEncode and UrlPathEncodeCssEncode

Incremento della protezione in maniera trasparente (no librerie esterne)

Built-In Bundling & Minification Bundling = accorpamento di più risorse al fine di ridurre le chiamate HTTP Applicazioni Web Responsive

Minification = Eliminazione dei caratteri non utili al fine di minimizzare la dimensione del file (.js o .css) da trasferire

Introduzione del concetto di Bundle Url «virtuale» a cui risponde ASP.NET 4.5 con le risorse «Bundled & Minified» Risponde con i file «originali» se in debug="true" Risponde con UN unico «file» (minificato) se debug="false"

Demo – Anti-Xss / Bundling & Minification / Lazy Validation

ASP.NET WebForms 4.5

Novità in WebForms 4.5 Strongly-Typed Data-binding (mono e bi-direzionali)

Model Binding (quasi come ASP.NET MVC ) Unobtrusive Validation HTML5 Template built-in

Strongly-typed Data Binding – 1 Controlli ASP.NET con supporto al «tipo nativo» da bindare;

Introdotta la proprietà ItemType per specificare il tipo del modello;

MAI più stringhe del tipo <%#Eval("FirstName") %>

Si utilizza Item.FirstName (o BindItem.FirstName per il 2-way)

Strongly-typed Data Binding – 2

ASP.NET <=4.0 ASP.NET 4.5

Model Binding MVC-style Stanchi di chiamare DataBind() ? Vorreste un Vs. metodo per popolare i dati da dare in «pasto» al controllo?

Aggiunte le proprietà SelectMethod, UpdateMethod, DeleteMethod e InsertMethod (possono essere anche su assembly differenti non solo nel code-behind)

Specificate i relativi metodi che potranno ritornare IQueryable<T> (esecuzioni differita) Paginazione e Ordinamenti «built-in» nel controllo che raffina

query LINQ – nativa su DB se usiamo EF)

Demo – Strongly-Typed DataBindinge Model Binding

Unobtrusive Validation Validazione client-side via AJAX ...ora anche su WebForm (finalmente ) Si abilita via web.config:

<appSettings><add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms" />

Oppure tramite proprietà System.Web.UI.ValidationSettings.UnobtrusiveValidationMode

Supporto ad HTML5 Controlli Server dei nuovi «tag» HTML5

<video ... > <asp:TextBox TextMode > - supporto ai tipi di TextBox HTML5 (e.g. Date, Email

ecc.) FileUpload – supporto ai file multipli

Web Api Focus Framework per lo Sviluppo ed il Consumo di servizi HTTP (RestFul e non solo...);

Creata seguendo principi di programmazione AGILI  e SOLIDI;

Trasforma il protocollo l'HTTP in una piattaforma di programmazione.

E’ Open Source http://aspnetwebstack.codeplex.com

Cos’è REST Sta per: REpresentational State Transfer. E' uno stile architetturale (diverso da SOAP che è un protocollo)

E’ stato discusso nel 2000 da Roy Fielding

Prima di Web Api nel mondo .NET non erano molte le alternative per sviluppare servizi REST:

1. OpenRASTA

2. ServiceStack

3. WCF - REST Toolkit e/o WCF Web Api

Le soluzioni basate su WCF erano funzionali, ma macchinose (es. configurazione complessa) e poco flessibili;

L'approccio REST con .NET

1. NON è basata su ASP.NET MVC (no System.Web.Mvc.dll)

2. Non è accoppiata al layer di HOSTING (no System.Web.dll)

Web Api miti da «sfatare»

Progetto: System.Web.Http >

1. Framework per lo Sviluppo ed il Consumo di servizi HTTP;

2. Distribuita con ASP.NET MVC4 (template di progetto MVC) ma disponibile via NuGet (utilizzabile con WebForms, WinServices, ConsoleApp, ecc…);

3. Poliedrica, perché possiamo sviluppare servizi web anche non completamente RESTFul, la WebAPI nasconde le complessità del protocollo HTTP;

Web Api (1)

1. Usa gli strumenti consolidati di ASP.NET (Model Binding, Routing);

2. Pensata con un approccio FRICTION-LESS (Zero Configuration, Zero Attributi)

3. Sfrutta il paradigma Convention-Over-Configuration(Selezione Automatica dei Formatters e Mapping delle Action)

4. Ricca di punti di estensibilità(Formatters, MessageHandlers, Filters, IOC)

5. Query Composition (Supporto Odata in fase di rilascio)

Web Api Framework (2)

La posizione nello stack ASP.NET

Per implementare un servizio è necessario:

1. Creare una classe controller ereditando da: ApiController;

2. Definire i Metodi ed abbinarli ad un verbo HTTPEs. PostBook, GetBooks() / convention over confEs. [HttpPost] SaveBook() / attribute decoration

3. Implementare i Metodi in modo che restituiscano al chiamante un oggetto serializzabile (DTO, HttpResponseMessage o JsonValue);

Sviluppare un Servizio con Web Api

Demo – webapi

Implementare il Controller

CONTROLLERBinding,Filtri,For

matter

PIPELINE DelegateHandle

r

HOSTHttpConfiguratio

n

Web Api - Layered View

La WebApi può essere ospitata in 2 modi differenti:

1. Self Hosting (basato su WCF ottima per Console App o Win Service)

2. WebHosting (basato su ASP.NET / IIS)

3. Potenzialmente potremmo creare altri Host (Azure, OWIN, ecc…)

Entrambi le soluzioni hanno in comune la classe HttpConfiguration

Hosting

Demo – webapiSelfHosting

Un message handler è una classe che prende in input una richiesta HTTP e restituisce in output un risposta HTTP (aysnc way).

Le classi HttpRequestMessage e HttpResponseMessage sono le primitive messe a disposizione dal framework per "manipolare" richieste e risposte.

Gli handlers sono concatenati, il primo riceve la richiesta, la processa e la passa all’handler seguente, fino ad arrivare ad un punto in cui viene creata la risposta che ripassa «al contrario» nella catena fino al client.

Message Handlers (1)

I messaggi che arrivano da Internet vengono presi e "pompati" all'interno del "canale" dei message handlers

Message Handlers (2)

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

Tutti gli handlers derivano dalla classe base HttpMessageHandler. 

Vi sono handlers built-in o server-side message handlers:

1. HttpServer => prende in carico la request dal layer HOST

2. QUI CI SONO GLI HANDLERS CUSTOM ( I NOSTRI)

3. HttpRoutingDispatcher => redireziona la request in base alla route.

4. HttpControllerDispatcher => invia la request al layer Controller

Gli handlers possono essere registrati a livello globale oppure per route.

Message Handlers (3)

Demo – webapi

Message Handlers

Meccanismo ereditato da ASP.NET permette di mappare un controller con una risorsa e i suoi metodi con i verbi http.

template: api/{controller}/{id}

Per i metodi possiamo usare gli attributi AcceptVerbs, HttpPost, HttpGet, ecc... o le convenzioni. Possiamo personalizzare il routing con i default values e i constraints.

Routing

La WebApi serializza automaticamente le risposte in JSON (default) e/o in XML sfruttando il meccanismo di content-negotiation dell'HTTP.

Accept : app/json => JsonMediaTypeFormatter Accept : app/xml => XmlMediaTypeFormatter Accept : */* => [XXX]MediaTypeFormatter

Per ogni altra esigenza possiamo scrivere "formatters" custom tramite la classe MediaTypeFormatters (Sync o Async).

Formattazione

I parametri dei metodi possono essere "popolati" da vari sorgenti come l’URI o il BODY della richiesta HTTP attraverso il meccanismo di "Model Binding" tipico di ASP.NET MVC.

I tipi semplici leggiamoli dall’URI i tipi complessi dal BODY!

In modo analogo ad MVC possiamo usare gli attributi di validazione sui nostri Models (aka DataAnnotations)

Model Binding e Validazione

Demo – webapi

model binding, validazione, formattazione

Aiutano a gestire i "cross cutting concerns" (validazione, logging, security). Possono essere configurati a livello: Applicazione / Controller / Azione

Ci sono 3 tipi di filtri:

Authorization - > prima del binding dei parms

Action -> dopo il binding dei params

Exception -> gestiscono le eccezioni generate nel layer Controller

Filtri

Progettata per ridurre le frizioni:

1. Nessuna classe statica per gestire il "context" HTTP;

2. Facilmente testabile, i componenti dell'API espongono le proprie dipendenze tramite parametri nei propri costruttori;

3. Presenza di un DependencyResolver (scoped via IDependencyScope) per facilitare l'iniezione di servizi e componenti nel costruttore del controller (composition root);

4. Esistono già implementazioni per i maggiori Container (AutoFac, Ninject, ecc…)

Testabilità e IOC

1. Supporto ODATA (in preview per ora, ma a breve integrato in modo ufficiale)

2. Filtro IQueryable sui metodi che devono supportare ODATA

3. Possibilità di comporre le query lato client (QueryString) e di trasmetterle al Server per l’esecuzione

Query Composition

Demo – webapiFiltri ed IOC

Q & A

Grazie a tutti per l’attenzione!

Recommended