1. .NET Core Saturday 2016 – 22.10.2016
Introduzione ad ASP.NET
Core
Andrea Dottor
Microsoft MVP ASP.NET
@dottor
2. .NET Core Saturday 2016 – 22.10.2016
Chi sono
Andrea Dottor
◇ Consulente e sviluppatore software
◇ Microsoft MVP ASP.NET
◇ presidente di XE – Development User Group
◇ email: andrea@dottor.net
◇ twitter: @dottor
3. .NET Core Saturday 2016 – 22.10.2016
Materiale
◇ Slide già disponibili su slideshare
■ http://www.slideshare.net/andreadottor
◇ Codice e slide a breve su
■ http://www.xedotnet.org/eventi/net-core-saturday/
4. .NET Core Saturday 2016 – 22.10.2016
Agenda
◇ Cos'è ASP.NET Core
◇ Perché ASP.NET Core
◇ Cambiamenti rispetto al passato
◇ Cosa c'è di nuovo
5. .NET Core Saturday 2016 – 22.10.2016
Cos'è ASP.NET Core
◇ E' l'ultima versione di ASP.NET
■ Chiamata in precedenza ASP.NET 5
◇ Non si tratta di una evoluzione ma di una completa riscrittura
◇ Può essere utilizzato "sopra" al .NET Framework 4.6 (completo)
permettendo il riutilizzo di librerie già in uso
◇ Può essere utilizzato "sopra" a .NET Core se vogliamo sfruttare le possibilità
del multipiattaforma
6. .NET Core Saturday 2016 – 22.10.2016
Perché ASP.NET Core?
◇ ASP.NET Core is no longer based on System.Web.dll
■ Le funzionalità sono state scomposte in packages che racchiudono (molto spesso) una
singola funzionalità
◇ New light-weight and modular HTTP request pipeline
■ Possibilità di referenziare solo le funzionalità che effettivamente verranno utilizzate
■ Possibilità di definire la pipeline
◇ Built on .NET Core, which supports true side-by-side app versioning
◇ bility to host on IIS or self-host in your own process
◇ Non si è più vincolati ad utilizzare Visual Studio come IDE di sviluppo
7. .NET Core Saturday 2016 – 22.10.2016
ASP.NET Core Releases
◇ 13 Settembre ASP.NET Core 1.0.1 (September 2016 Update)
◇ 27 Giugno ASP.NET Core 1.0.0
◇ 16 Maggio ASP.NET Core RC2
◇ 18 Novembre ASP.NET 5 RC1
◇ …
◇ Visibili su github:
■ https://github.com/aspnet/home/releases
8. .NET Core Saturday 2016 – 22.10.2016
Togliamo subito alcuni dubbi [1]
◇ Supporto a Visual Basic .NET?
■ Non c'è ancora il supporto a Visual Basic .NET, ma arriverà.
■ E' presente nella roadmap pubblica su github
◇ Progetti esistenti fatti con MVC 5, si possono convertire?
■ No, non esiste alcun convertitore
9. .NET Core Saturday 2016 – 22.10.2016
Togliamo subito alcuni dubbi [2]
◇ .NET Framework o .NET Core?
■ .NET Framework è più maturo come tecnologia e permette di riutilizzare gran parte del
codice scritto. Si è vincolati al solo SO Windows
■ .NET Core permette di utilizzare e referenziare le sole dll effettivamente utilizzate. Può
girare su Linux, Windows e Mac. Le app possono essere pubblicate su Nano Server
◇ Alcuni dati sulle performance (febbraio 2016):
■ ASP.NET 4.6: <50k req/sec
■ ASP.NET Core (CLR): 400k req/sec
■ ASP.NET Core (.NET Core, Linux): 900k req/sec
■ ASP.NET Core (.NET Core, Windows): >1.1m req/sec
■ https://vimeo.com/172009499
■ https://github.com/aspnet/benchmarks
10. .NET Core Saturday 2016 – 22.10.2016
Iniziamo a conoscere ASP.NET
Core
3….2….1….si inizia
11. .NET Core Saturday 2016 – 22.10.2016
Struttura del progetto
alcune differenze rispetto al passato
◇ Tutti i file statici vanno inseriti all'interno della cartella
wwwroot
◇ Il file di progetto attualmente è il file json project.json
■ A breve verrà sostituito con una versione aggiornata del file csproj
◇ La configurazione custom di default è in un file
appsettings.json
◇ Il file web.config è mantenuto solo configurazione del
webserver
12. .NET Core Saturday 2016 – 22.10.2016
Application Startup
◇ L'entrypoint dell'applicazione è dato dalla classe Startup
◇ Metodo Configure: permette di configurare dettagliatamente come
vogliamo sia composta la pipeline della nostra app
○ Definizione middleware da utilizzare
○ Definizione regole di routing
○ …
◇ Metodo ConfigureServices: permette di definire i servizi da utilizzare
■ Identity
■ MVC
■ Dependency Injection
■ …
13. .NET Core Saturday 2016 – 22.10.2016
Configurazione
◇ Non ci si basa più sul file web.config
◇ Possibilità di configurare l'applicativo da più tipologie di file di
configurazione
◇ Uso di chiave-valore
■ Possibilità di mappare delle sezioni su nostre classi custom
◇ Vengono forniti alcuni extension-method per semplificare l'accesso
■ es:
Configuration.GetConnectionString("DefaultConnection")
è equivalente a:
Configuration.GetSection("ConnectionStrings")["DefaultConnection"]
15. .NET Core Saturday 2016 – 22.10.2016
Un unico Controller
◇ Niente più differenza tra Web API e MVC
◇ Ereditano da Microsoft.AspNet.Mvc.Controller (ma anche no)
◇ Sono Action tutti i metodi pubblici del controller.
■ Se ritorniamo un IActionResult abbiamo lo stesso comportamento di una action MVC
■ Se non ritorniamo un IActionResult, si tratta di un metodo delle WebAPI (quindi content
negotiation o ProducesAttribute)
◇ Usare NonActionAttribute per i metodi che non devono essere richiamabili
direttamente
16. .NET Core Saturday 2016 – 22.10.2016
POCO Controller (Plain Old CLR Object)
◇ E' possibile definire classi controller che non ereditino da Controller
■ Non serve implementare interfacce o estendere classi basi
◇ Il nome della classe DEVE terminare con "Controller"
◇ NOTE: E' bene farsi passare tramite DI: IUrlHelperFactory e
IActionContextAccessor
17. .NET Core Saturday 2016 – 22.10.2016
State migrando un progetto con WebAPI?
◇ Prestate attenzione agli oggetti ritornati in JSON in quanto il casing è
cambiato!
■ In ASP.NET Core la serializzazione in JOSN usa il camelCasing per il nomi delle proprietà
■ In ASP.NET MVC fino alla versione 5, l'oggetto ritornata usava lo stesso casing del nome
della proprietà
◇ Per mantenere il comportamento precedente:
services.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ContractResolver =
new Newtonsoft.Json.Serialization.DefaultContractResolver();
});
19. .NET Core Saturday 2016 – 22.10.2016
Tag helper
◇ HTML helper utilizzati come tag
◇ Estende/arricchisce i tag HTML con attributi che vegono eseguiti server-side
◇ Più facile personalizzare l’HTML
◇ Più facile lavorare in un editor HTML
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="UserName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="UserName" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
21. .NET Core Saturday 2016 – 22.10.2016
View Components
◇ Simili alle PartialView
◇ Composti da un proprio file di code-behind e view
■ Una classe di “code-behind” simile ad un mini controller.
○ Eredita da ViewComponent e richiede di implementare il metodo Invoke
■ Una view che ne definisce la visualizzazione
◇ Possono venire inclusi in una Class Library, facilitandone quindi il riutilizzo
■ https://channel9.msdn.com/Series/aspnetmonsters/ASPNET-Monsters-Episode-52-
Loading-View-Components-from-a-Class-Library
@Component.Invoke("TagList")
23. .NET Core Saturday 2016 – 22.10.2016
Dependency injection
◇ DI implementato out of the box.
◇ Possibilità di utilizzo del Container preferito
(es: Autofac, Ninject, Unity, Windsor, …)
◇ Gestisce vari tipi di Lifestyle
■ Instance: Una nuova istanza viene creta ogni volta. Siamo noi a specificare come creare
l’istanza (parametri nel costruttore).
■ Transient: Una nuova istanza viene creta ogni volta
■ Singleton: Viene creta una singola istanza, e viene ritornata sempre quella
■ Scoped: Viene creta un’istanza per ogni richiesta.
24. .NET Core Saturday 2016 – 22.10.2016
Dependency injection into views
◇ Possibilità di iniettare una classe/servizio all’interno delle View per poterne
richiamare i metodi
Come fare:
◇ Dichiarare il servizio in fase di Startup
■ services.AddTransient<TodoList.Services.StatisticsService>();
◇ Nella view o nel file _ViewImports.cshtml utilizzare @inject
■ @inject TodoList.Services.StatisticsService Statistics
◇ Richiamare i metodi dalla view (supporto anche per async await)
■ @await Statistics.GetCount()
26. .NET Core Saturday 2016 – 22.10.2016
Managing Application State - Session
◇ Richiede che venga installato il package Microsoft.AspNetCore.Session
◇ Essendo construita sopra a IDistributedCache richiende anche il package
Microsoft.Extensions.Caching.Memory
◇ Nel metodo ConfigureServices del file Startup, abilitarla richiamando:
services.AddDistributedMemoryCache();
services.AddSession(options => {
options.CookieName = ".DottorWeb.Session";
options.IdleTimeout = TimeSpan.FromSeconds(10);
});
◇ Nel metodo Configure del file Startup
app.UseSession();
27. .NET Core Saturday 2016 – 22.10.2016
Usate il TempData?
◇ Il TempData fa uso della session, e quindi la dovete attivare!
◇ In ASP.NE Core 1.1 verrà introdotto un "Cookie-based TempData provider"
28. .NET Core Saturday 2016 – 22.10.2016
Roadmap
◇ 1.1
■ URL Rewriting middleware
■ Response caching middleware
■ DI improvements for 3rd party containers
■ WebListener server (Windows only)
■ Middleware as MVC filters
■ ViewComponents as Tag Helpers
■ View precompilation
■ Cookie-based TempData provider
■ Improved Azure integration
◇ 1.2
■ WebSockets
■ SignalR
■ Razor Pages (Views without MVC controllers)
■ Web API security
29. .NET Core Saturday 2016 – 22.10.2016
Nuovi tool in VS "15"
◇ New Template
■ 1 file di progetto
■ 1 file .cs
◇ New csproj Format
32. .NET Core Saturday 2016 – 22.10.2016
Andrea Dottor
◇ Consulente e sviluppatore software
◇ Microsoft MVP ASP.NET
◇ presidente di XE – Development User Group
◇ email: andrea@dottor.net
◇ twitter: @dottor