Matthias Jauernig
www.jauernig-it.de
matthias@jauernig-it.de
@JauernigIT
Frankfurt/Rhein-Main
Professionell. Individuell. Innovativ.
ASP.NET Core Middlewares
Matthias Jauernig
Sourcecode zum Vortrag
 https://github.com/JauernigIT/aspnetcore_middlewares
 Demo für Run/Use/Map
 Demo für Angular 4 mit ASP.NET Core inkl. 2 Middlewares (SPA Routing, Old Browser Detection)
 Demo für Response-Veränderung (Filtern von Schimpfwörtern)
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 2
Matthias Jauernig
Wer ich bin
 Freiberuflicher Webentwickler/-architekt
 Raum Frankfurt / Rhein-Main
 10 Jahre Erfahrung in professioneller Softwareentwicklung
 C#/.NET, .NET Core, ASP.NET MVC, TypeScript, Angular 4, Kendo UI
Wie ich zu .NET Core komme
 Privat & aktuelles Projekt (Bank, öffentliche Webseite)
 Frontend: Single Page Application (SPA)
Backend: .NET Core als leichtgewichtige Hosting-Lösung
 20 genutzte Middlewares, davon 12 eigenentwickelt
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 3
www.jauernig-it.de
Einleitung
Was ist eine Middleware?
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 5
Argonne National Laboratory
CC BY-SA 2.0, @Wikimedia
?
Was ist eine Middleware?
Das ist eine Middleware:
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 6
app.Run(async context =>
{
await context.Response
.WriteAsync("Hello World!");
});
Was ist eine Middleware?
Definition
“Middleware is software that is
assembled into an application pipeline
to handle requests and responses.”
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 7
Quelle: ASP.NET Core Docs, Microsoft
Was ist eine Middleware?
ASP.NET Core Middleware  Request Delegate
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 8
public Task Invoke(HttpContext context)
{
// do something
}
Demo Starter-Projekt
ASP.NET Core Middlewares
Basierend auf Best Practices der WebDev Community
 Node.js Express
 Rails on Rack
 …
Evolution aus OWIN Middlewares
 Konzept der Middleware-Pipeline zur Verarbeitung von Requests/Responses
 Einfacher als OWIN Middlewares (zusätzliche Abstraktionen), verbessertes DI
 Nutzbarkeit von OWIN Middlewares in ASP.NET Core (app.UseOwin())
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 10
ASP.NET Core Middlewares
Ablösung von HTTP-Handlern und HTTP-Modulen
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 11
Authorization
Module Andere Module
MVC
HTTP Handler
.report
HTTP Handler
Unauthorized
request
Request for
/Home/Index
Request for
/sales.report
Quelle: ASP.NET Core Docs, Microsoft
Middlewares vs. HTTP-Handler/Module
HTTP-Handler/Module
 Handler: Request-Verarbeitung abhängig von Dateiname/Dateiendung
 Module:
 für jeden Request ausgeführt
 Reihenfolge abhängig von Lifecycle Events und web.config
ASP.NET Core Middlewares
 Ablösung/Vereinheitlichung beider Konzepte
 Einfacher und verständlicher als HTTP-Handler/Module (keine magic classes)
 Pipeline-Definition und Reihenfolge per Code (keine magic web.config)
 Flexibilität in Pipeline-Aufbau (Verzweigungen, etc.)
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 12
Middlewares verwenden
Die Request-Pipeline aufbauen
Request-Verarbeitung: Run()
 Request verarbeiten und direkt zurückkehren
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 14
Run()
Die Request-Pipeline aufbauen
Request-Verarbeitung: Use()
 Request verarbeiten und nächste Middleware in der Pipeline aufrufen
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 15
Use() Run()Use()
Die Request-Pipeline aufbauen
Request-Verarbeitung: Map()
 auf eine andere Pipeline verzweigen, abhängig von einer festgelegten Bedingung
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 16
Run()Map()Use()
Use()
Use()
Demo Run, Use, Map
Die Request-Pipeline aufbauen
Ausführungsreihenfolge
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 18
Quelle: ASP.NET Core Docs, Microsoft
Die Request-Pipeline aufbauen
Reihenfolge ist entscheidend!
 Verhalten: wird das Gewünschte getan?
 Sicherheit: wird zu viel Information preisgegeben?
 Performance: wird zu viel ausgeführt?
Verbesserung der Performance
 Häufig ausgeführte Operationen weiter oben
 Ressourcenintensive Operationen weiter unten
 Nur möglich, wenn Verhalten nicht beeinträchtigt wird
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 19
Eingebaute Middlewares nutzen
 Authentication
 CORS
 Error Handling
 Response Caching
 Response Compression
 Routing
 Session
 File Server
 Static Files
 URL Rewriting
 MVC
 …
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 20
Demo ASP.NET Core & Angular 4
Eigene Middlewares
Eigene Middlewares schreiben
Eigene Middleware-Klassen
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 23
class SomethingMiddleware {
private RequestDelegate next;
public SomethingMiddleware(RequestDelegate next) {
this.next = next;
}
public async Task Invoke(HttpContext context) {
// do something ...
await next(context);
}
}
Eigene Middlewares schreiben
Best Practice: IApplicationBuilder Erweiterungsmethode
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 24
static class IApplicationBuilderExtensions {
public static IApplicationBuilder
UseSomething(this IApplicationBuilder app) {
return app.UseMiddleware<SomethingMiddleware>();
}}
 „Factory-Methode“ zur Erzeugung der Middleware
 Übergabe von Konstruktor-Parametern manuell möglich (DI automatisch)
Demo SPA Routing
Demo Veralteten Browser erkennen
Eigene Middlewares schreiben
Response verändern - Achtung!
 Response (Header, Body) kann nur vor dem ersten Schreiben verändert werden
 Response wird aus Performancegründen gestreamt
 Beim ersten Schreiben des Response Bodies beginnt der Server die Header zu senden
 Header, Status Code etc. können nur vor dem ersten Schreiben geändert werden
 Generelle Regel: beim Schreiben des Response die Pipeline beenden
 Response nicht mehr nach dem Aufruf der nächsten Middleware ändern
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 27
Eigene Middlewares schreiben
Response verändern - Was tun?
 Beispiel: alle „Schimpfwörter“ sollen aus dem Response-Content entfernt werden
 Möglichkeit 1: nicht durch Middleware lösen, sondern tiefer in der Businesslogik
 Möglichkeit 2: temporärer MemoryStream (Achtung  Performance!)
 Beispiel: Header-Feld ändern (Cache, StatusCode, Encoding, …)
 context.Response.OnStarting() abonnieren
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 28
Demo Schimpfwörter filtern
Zusammenfassung
Anwendungsfälle
Einsatz im aktuellen Projekt
 Angular/SPA Routing
 Mobile Device Detection
 Prerendering der SPA (prerender.io)
 Proxy (z.B. zu Web API)
 Dynamische sitemap.xml und robots.txt-Builder
 Detektion alter Browser
 Caching mit speziellen Caching-Regeln
 Filterung von Requests
 Autorisierung/Authentifizierung
 …
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 31
Zusammenfassung
Warum Middlewares nutzen?
 Zentrales Konzept von ASP.NET Core
 Cross-Platform
 Einfach zu implementieren
 Pipeline-Aufbau: Volle Flexibilität und Transparenz
 Performance! https://www.techempower.com/blog/2016/11/16/framework-benchmarks-round-13/
 um ein Vielfaches schneller als ASP.NET oder Mono
26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 32
Matthias Jauernig
www.jauernig-it.de
matthias@jauernig-it.de
@JauernigIT
Frankfurt/Rhein-Main
Professionell. Individuell. Innovativ.
ASP.NET Core Middlewares

Einführung in ASP.NET Core Middlewares

  • 1.
  • 2.
    Matthias Jauernig Sourcecode zumVortrag  https://github.com/JauernigIT/aspnetcore_middlewares  Demo für Run/Use/Map  Demo für Angular 4 mit ASP.NET Core inkl. 2 Middlewares (SPA Routing, Old Browser Detection)  Demo für Response-Veränderung (Filtern von Schimpfwörtern) 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 2
  • 3.
    Matthias Jauernig Wer ichbin  Freiberuflicher Webentwickler/-architekt  Raum Frankfurt / Rhein-Main  10 Jahre Erfahrung in professioneller Softwareentwicklung  C#/.NET, .NET Core, ASP.NET MVC, TypeScript, Angular 4, Kendo UI Wie ich zu .NET Core komme  Privat & aktuelles Projekt (Bank, öffentliche Webseite)  Frontend: Single Page Application (SPA) Backend: .NET Core als leichtgewichtige Hosting-Lösung  20 genutzte Middlewares, davon 12 eigenentwickelt 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 3 www.jauernig-it.de
  • 4.
  • 5.
    Was ist eineMiddleware? 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 5 Argonne National Laboratory CC BY-SA 2.0, @Wikimedia ?
  • 6.
    Was ist eineMiddleware? Das ist eine Middleware: 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 6 app.Run(async context => { await context.Response .WriteAsync("Hello World!"); });
  • 7.
    Was ist eineMiddleware? Definition “Middleware is software that is assembled into an application pipeline to handle requests and responses.” 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 7 Quelle: ASP.NET Core Docs, Microsoft
  • 8.
    Was ist eineMiddleware? ASP.NET Core Middleware  Request Delegate 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 8 public Task Invoke(HttpContext context) { // do something }
  • 9.
  • 10.
    ASP.NET Core Middlewares Basierendauf Best Practices der WebDev Community  Node.js Express  Rails on Rack  … Evolution aus OWIN Middlewares  Konzept der Middleware-Pipeline zur Verarbeitung von Requests/Responses  Einfacher als OWIN Middlewares (zusätzliche Abstraktionen), verbessertes DI  Nutzbarkeit von OWIN Middlewares in ASP.NET Core (app.UseOwin()) 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 10
  • 11.
    ASP.NET Core Middlewares Ablösungvon HTTP-Handlern und HTTP-Modulen 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 11 Authorization Module Andere Module MVC HTTP Handler .report HTTP Handler Unauthorized request Request for /Home/Index Request for /sales.report Quelle: ASP.NET Core Docs, Microsoft
  • 12.
    Middlewares vs. HTTP-Handler/Module HTTP-Handler/Module Handler: Request-Verarbeitung abhängig von Dateiname/Dateiendung  Module:  für jeden Request ausgeführt  Reihenfolge abhängig von Lifecycle Events und web.config ASP.NET Core Middlewares  Ablösung/Vereinheitlichung beider Konzepte  Einfacher und verständlicher als HTTP-Handler/Module (keine magic classes)  Pipeline-Definition und Reihenfolge per Code (keine magic web.config)  Flexibilität in Pipeline-Aufbau (Verzweigungen, etc.) 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 12
  • 13.
  • 14.
    Die Request-Pipeline aufbauen Request-Verarbeitung:Run()  Request verarbeiten und direkt zurückkehren 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 14 Run()
  • 15.
    Die Request-Pipeline aufbauen Request-Verarbeitung:Use()  Request verarbeiten und nächste Middleware in der Pipeline aufrufen 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 15 Use() Run()Use()
  • 16.
    Die Request-Pipeline aufbauen Request-Verarbeitung:Map()  auf eine andere Pipeline verzweigen, abhängig von einer festgelegten Bedingung 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 16 Run()Map()Use() Use() Use()
  • 17.
  • 18.
    Die Request-Pipeline aufbauen Ausführungsreihenfolge 26.06.2017Matthias Jauernig - ASP.NET Core Middlewares 18 Quelle: ASP.NET Core Docs, Microsoft
  • 19.
    Die Request-Pipeline aufbauen Reihenfolgeist entscheidend!  Verhalten: wird das Gewünschte getan?  Sicherheit: wird zu viel Information preisgegeben?  Performance: wird zu viel ausgeführt? Verbesserung der Performance  Häufig ausgeführte Operationen weiter oben  Ressourcenintensive Operationen weiter unten  Nur möglich, wenn Verhalten nicht beeinträchtigt wird 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 19
  • 20.
    Eingebaute Middlewares nutzen Authentication  CORS  Error Handling  Response Caching  Response Compression  Routing  Session  File Server  Static Files  URL Rewriting  MVC  … 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 20
  • 21.
    Demo ASP.NET Core& Angular 4
  • 22.
  • 23.
    Eigene Middlewares schreiben EigeneMiddleware-Klassen 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 23 class SomethingMiddleware { private RequestDelegate next; public SomethingMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { // do something ... await next(context); } }
  • 24.
    Eigene Middlewares schreiben BestPractice: IApplicationBuilder Erweiterungsmethode 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 24 static class IApplicationBuilderExtensions { public static IApplicationBuilder UseSomething(this IApplicationBuilder app) { return app.UseMiddleware<SomethingMiddleware>(); }}  „Factory-Methode“ zur Erzeugung der Middleware  Übergabe von Konstruktor-Parametern manuell möglich (DI automatisch)
  • 25.
  • 26.
  • 27.
    Eigene Middlewares schreiben Responseverändern - Achtung!  Response (Header, Body) kann nur vor dem ersten Schreiben verändert werden  Response wird aus Performancegründen gestreamt  Beim ersten Schreiben des Response Bodies beginnt der Server die Header zu senden  Header, Status Code etc. können nur vor dem ersten Schreiben geändert werden  Generelle Regel: beim Schreiben des Response die Pipeline beenden  Response nicht mehr nach dem Aufruf der nächsten Middleware ändern 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 27
  • 28.
    Eigene Middlewares schreiben Responseverändern - Was tun?  Beispiel: alle „Schimpfwörter“ sollen aus dem Response-Content entfernt werden  Möglichkeit 1: nicht durch Middleware lösen, sondern tiefer in der Businesslogik  Möglichkeit 2: temporärer MemoryStream (Achtung  Performance!)  Beispiel: Header-Feld ändern (Cache, StatusCode, Encoding, …)  context.Response.OnStarting() abonnieren 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 28
  • 29.
  • 30.
  • 31.
    Anwendungsfälle Einsatz im aktuellenProjekt  Angular/SPA Routing  Mobile Device Detection  Prerendering der SPA (prerender.io)  Proxy (z.B. zu Web API)  Dynamische sitemap.xml und robots.txt-Builder  Detektion alter Browser  Caching mit speziellen Caching-Regeln  Filterung von Requests  Autorisierung/Authentifizierung  … 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 31
  • 32.
    Zusammenfassung Warum Middlewares nutzen? Zentrales Konzept von ASP.NET Core  Cross-Platform  Einfach zu implementieren  Pipeline-Aufbau: Volle Flexibilität und Transparenz  Performance! https://www.techempower.com/blog/2016/11/16/framework-benchmarks-round-13/  um ein Vielfaches schneller als ASP.NET oder Mono 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 32
  • 33.