Sviluppare app per iOS e Android con Xamarin e Visual Studio
Applicazioni web con ASP.NET Owin e Katana
1. Applicazioni web più performanti
(e cross-platform) con OWIN & Katana
Nicolò Carandini – MVP Visual C#
2. Agenda
• Web &Tools evolution
• OWIN: OpenWeb Interface for .NET
• Katana : Microsoft Owin
• Moduli e Pipeline
• Self-Host in un’app Console
• Self-Host su AzureWork role
• Costruire un modulo custom
3. Web & Tools evolution
2002 2013
569 milioni 2,4 miliardi
46 minuti al giorno
3 milioni
4 ore al giorno
555 milioni
Static File Serving
Dynamic Page
Generation
Web API
Real-Time
Push Notifications
...
Modern Web App
4. Tool: Evoluzione del modello di rilascio
• ASP.NET incluso nel .NET Framework
• Almeno un anno tra un rilascio e l’altro
• ASP.NET MVC eWebAPI stand-alone
• Rilasci intra-annuali
• "One ASP.NET" modulare
• Rilasci frequenti e indipendenti dei singoli moduli tramite
NuGet
6. Hosting: IIS web server
Reliability
Scalable Web
Infrastructure
Dynamic Caching and
Compression
Rich Diagnostic Tools
Choice
ASP.NET and PHP
Support
Modular and
Extensible Web Server
Integrated Media
Platform
Security
Enhanced Server
Protection
Secure Content
Publishing
Access Protection
Control
Centralized
Web Farm
Management
Delegated Remote
Management
Powerful
Admin Tools
7. Web Hosting: IIS pro/versus
• Pro
• È un sistema integrato, potente ed affidabile
• È "da sempre" modulare (HttpModules, HttpHandlers)
• Contro
• È monolitico (prendi tutto o niente)
• Unifica le funzioni di Host e di Server
• I moduli non sono facilmente testabili
• I moduli devono essere riscritti se li si vuol far "girare" in
un altro Host
8. Verso una nuova architettura
Host
Server
Application
Middleware
Framework
9. Con un nuovo standard
OWIN: Open Web Interface for .NET
• Cos’è:
Una specifica che descrive un’interfaccia standard tra
web servers e .NET applications
• A cosa serve:
Disaccoppiando le diverse parti che compongono il
l’applicazione, consente di scrivere moduli facilmente
testabili che possono girare senza modifiche su Host di
diverso tipo.
10. OWIN: environment dictionary
• IDictionary<string, object>
Key Name Value Description
"owin.RequestBody" A Stream with the request body, if any. Stream.Null MAY be used
as a placeholder if there is no request body.
"owin.RequestHeaders" An IDictionary<string, string[]> of request headers.
"owin.RequestMethod" A string containing the HTTP request method of the request (e.g.,
"GET", "POST").
"owin.RequestPath" A string containing the request path.The path MUST be relative
to the "root" of the application delegate.
"owin.RequestPathBase" A string containing the portion of the request path corresponding
to the "root" of the application delegate.
"owin.RequestProtocol" A string containing the protocol name and version (e.g.
"HTTP/1.0" or "HTTP/1.1").
"owin.RequestQueryString" A string containing the query string component of the HTTP
request URI, without the leading “?” (e.g., "foo=bar&baz=quux").
The value may be an empty string.
"owin.RequestScheme" A string containing the URI scheme used for the request (e.g.,
"http", "https").
12. OWIN: Host loader
All’avvio, l’Host si incarica di mettere insieme tutte le
parti:
•Crea l‘environment dictionary
•Istanzia il Server
•Chiama il codice di setup dell’applicazione ottenendo
come risultato l’application delegate
•Consegna al Server l’application delegate che è
l’application entry point
13. OWIN: request execution
Per ogni richiesta HTTP:
•Il server chiama l’applicazione tramite
l’application delegate fornendo come
argomento il dizionario contenente i dati della
richiesta e della risposta.
•L’applicazione popola la risposta o restituisce
un errore.
14. Hosting: IIS Vs. OWIN
Internet Information Server
Classic / Integrated
CGI
Compression
Request Tracing
Authentication
OWIN Based Host
All avvio viene
costruita la
pipeline con i soli
componenti
necessari
15. Microsoft Owin (aka Katana)
• Microsoft OWIN è formato dall’insieme dei
componenti OWIN che pur essendo open source,
sono costruiti e rilasciati da Microsoft.
• L’insieme comprende sia componenti infrastrutturali,
come Host e Server, sia componenti funzionali, come
i moduli di autenticazione e di binding a framework
quali SignalR e ASP.NETWeb API.
16. OWIN: Host
•Ci sono diverse implementazioni:
Custom Host: Microsoft.Owin.SelfHost
IIS/ASP.NET:
Microsoft.Owin.Host.SystemWeb
19. OWIN Middleware Component
• Tutti i packages Microsoft.Owin.Security.* che fanno
parte del nuovo Identity System diVisual Studio 2013
(i.e. Cookies, Microsoft Account, Google, Facebook,
Twitter, BearerToken, OAuth, Authorization server,
JWT, Windows Azure Active directory, and Active
directory federation services) sono realizzati come
“OWIN Middleware Component” e possono essere
usati in entrambi gli scenari self-hosted e IIS-hosted.
21. Moduli e pipeline: IAppBuilder
public interface IAppBuilder
{
IDictionary<string, object> Properties { get; }
object Build(Type returnType);
IAppBuilder New();
IAppBuilder Use(object middleware, params object[] args);
}
public static class AppBuilderUseExtensions
{
public static IAppBuilder Use<T>(this IAppBuilder app, params object[] args)
public static void Run(this IAppBuilder app, Func<IOwinContext, Task> handler)
public static IAppBuilder Use(this IAppBuilder app,
Func<IOwinContext, Func<Task>, Task> handler)
}
22. Moduli e pipeline: AppBuilder
namespace Microsoft.Owin.Builder
{
using AppFunc = Func<IDictionary<string, object>, Task>;
/// <summary>
/// A standard implementation of IAppBuilder
/// </summary>
public class AppBuilder : IAppBuilder
{
private static readonly AppFunc NotFound = new NotFound().Invoke;
private readonly IList<Tuple<Type, Delegate, object[]>> _middleware;
private readonly IDictionary<Tuple<Type, Type>, Delegate> _conversions;
private readonly IDictionary<string, object> _properties;
23. Creazione della pipeline
Il Loader:
• Crea una istanza di AppBuilder
• Identifica la classe di startup
• Chiama il metodo Configuration(IAppBuilder app)
• Crea una lista ordinata dei componenti con gli associati parametri di
creazione
• Istanzia i componenti passando a ciascuno il componente successivo
e i parametri di creazione.
24. Funzionamento della pipeline
La chiamata al primo componente produce l’esecuzione di tutti i
componenti della pipeline:
Middleware
Middleware
Middleware
Empty Middleware
25. Microsoft Owin: application
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
}
}
26. Costruire un modulo custom
public class LoggerMiddleware : OwinMiddleware
{
private readonly ILog _logger;
public LoggerMiddleware(OwinMiddleware next, ILog logger)
: base(next)
{
_logger = logger;
}
public override async Task Invoke(IOwinContext context)
{
_logger.LogInfo("Middleware begin");
await this.Next.Invoke(context);
_logger.LogInfo("Middleware end");
}
}
27. Utilizzare un modulo custom
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.Use<LoggerMiddleware>(new EasyLogger());
...
}
}