SlideShare a Scribd company logo
1 of 33
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

More Related Content

What's hot

Taugt AngularJS wirklich was? Erfahrungsbericht und Ausblick
Taugt AngularJS wirklich was? Erfahrungsbericht und AusblickTaugt AngularJS wirklich was? Erfahrungsbericht und Ausblick
Taugt AngularJS wirklich was? Erfahrungsbericht und AusblickPhilipp Burgmer
 
Spring Boot - Wird Spring jetzt wirklich einfach?
Spring Boot - Wird Spring jetzt wirklich einfach?Spring Boot - Wird Spring jetzt wirklich einfach?
Spring Boot - Wird Spring jetzt wirklich einfach?jenspresser
 
Creasoft c-Day 2009 - Webtechnologien der Zukunft
Creasoft c-Day 2009 - Webtechnologien der ZukunftCreasoft c-Day 2009 - Webtechnologien der Zukunft
Creasoft c-Day 2009 - Webtechnologien der ZukunftCreasoft AG
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Chris Michael Klinger
 
Creasoft - Windows Azure
Creasoft - Windows AzureCreasoft - Windows Azure
Creasoft - Windows AzureCreasoft AG
 
Creasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVCCreasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVCCreasoft AG
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit MavenStefan Scheidt
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1Manfred Steyer
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...Marc Müller
 
Windows 8 für Entwickler
Windows 8 für EntwicklerWindows 8 für Entwickler
Windows 8 für EntwicklerJan Hentschel
 
Java-Webanwendungen mit Vaadin 8
Java-Webanwendungen mit Vaadin 8Java-Webanwendungen mit Vaadin 8
Java-Webanwendungen mit Vaadin 8gedoplan
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 

What's hot (19)

Einführung Maven
Einführung MavenEinführung Maven
Einführung Maven
 
Taugt AngularJS wirklich was? Erfahrungsbericht und Ausblick
Taugt AngularJS wirklich was? Erfahrungsbericht und AusblickTaugt AngularJS wirklich was? Erfahrungsbericht und Ausblick
Taugt AngularJS wirklich was? Erfahrungsbericht und Ausblick
 
Spring Boot - Wird Spring jetzt wirklich einfach?
Spring Boot - Wird Spring jetzt wirklich einfach?Spring Boot - Wird Spring jetzt wirklich einfach?
Spring Boot - Wird Spring jetzt wirklich einfach?
 
Creasoft c-Day 2009 - Webtechnologien der Zukunft
Creasoft c-Day 2009 - Webtechnologien der ZukunftCreasoft c-Day 2009 - Webtechnologien der Zukunft
Creasoft c-Day 2009 - Webtechnologien der Zukunft
 
Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)Introduction to Apache Maven 3 (German)
Introduction to Apache Maven 3 (German)
 
Elsholz stoll js_03_10
Elsholz stoll js_03_10Elsholz stoll js_03_10
Elsholz stoll js_03_10
 
Creasoft - Windows Azure
Creasoft - Windows AzureCreasoft - Windows Azure
Creasoft - Windows Azure
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Creasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVCCreasoft Akademie - Deep Dive into ASP.NET MVC
Creasoft Akademie - Deep Dive into ASP.NET MVC
 
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetproTest-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
Test-Automation mit Selenium WebDriver - ein Artikel der iks im dotnetpro
 
Automatischer Build mit Maven
Automatischer Build mit MavenAutomatischer Build mit Maven
Automatischer Build mit Maven
 
3. Night of the pack
3. Night of the pack3. Night of the pack
3. Night of the pack
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
 
Automatisierung mit grunt
Automatisierung mit gruntAutomatisierung mit grunt
Automatisierung mit grunt
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
 
Windows 8 für Entwickler
Windows 8 für EntwicklerWindows 8 für Entwickler
Windows 8 für Entwickler
 
Java-Webanwendungen mit Vaadin 8
Java-Webanwendungen mit Vaadin 8Java-Webanwendungen mit Vaadin 8
Java-Webanwendungen mit Vaadin 8
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 

Similar to Einführung in ASP.NET Core Middlewares

Architekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenArchitekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenRobin Sedlaczek
 
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5Digicomp Academy AG
 
MongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBMongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBTobias Trelle
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungEduard Hildebrandt
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
Präsentation webservices
Präsentation webservicesPräsentation webservices
Präsentation webservicesxxtesaxx
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
Mobile Development mit ASP.NET MVC 4
Mobile Development mit ASP.NET MVC 4Mobile Development mit ASP.NET MVC 4
Mobile Development mit ASP.NET MVC 4Digicomp Academy AG
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenHendrik Lösch
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core ApplicationsRobin Sedlaczek
 
.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht
.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht
.NET Core, .NET Standard & ASP.NET Core - Eine ÜbersichtJürgen Gutsch
 
SokaHH: Testen von Rich-Web-UI (German)
SokaHH: Testen von Rich-Web-UI (German)SokaHH: Testen von Rich-Web-UI (German)
SokaHH: Testen von Rich-Web-UI (German)Mark Michaelis
 
MEAN SCS in der Cloud
MEAN SCS in der CloudMEAN SCS in der Cloud
MEAN SCS in der CloudTorsten Fink
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009Andreas Schulte
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...LeanIX GmbH
 
Rapid Application Development mit Openobject
Rapid Application Development mit OpenobjectRapid Application Development mit Openobject
Rapid Application Development mit Openobjectopenbig
 

Similar to Einführung in ASP.NET Core Middlewares (20)

Architekturen für .NET Core-Anwendungen
Architekturen für .NET Core-AnwendungenArchitekturen für .NET Core-Anwendungen
Architekturen für .NET Core-Anwendungen
 
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
Fachreferat: Visual Studio 2012, Windows 8 und .NET 4.5
 
MongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBMongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDB
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
Präsentation webservices
Präsentation webservicesPräsentation webservices
Präsentation webservices
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
AngularJs
AngularJsAngularJs
AngularJs
 
Workshop Vue js
Workshop Vue jsWorkshop Vue js
Workshop Vue js
 
Mobile Development mit ASP.NET MVC 4
Mobile Development mit ASP.NET MVC 4Mobile Development mit ASP.NET MVC 4
Mobile Development mit ASP.NET MVC 4
 
Ionic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf SteroidenIonic 2 - Hybridapps auf Steroiden
Ionic 2 - Hybridapps auf Steroiden
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core Applications
 
.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht
.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht
.NET Core, .NET Standard & ASP.NET Core - Eine Übersicht
 
BizSpark goes Cloud
BizSpark goes CloudBizSpark goes Cloud
BizSpark goes Cloud
 
Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?
 
SokaHH: Testen von Rich-Web-UI (German)
SokaHH: Testen von Rich-Web-UI (German)SokaHH: Testen von Rich-Web-UI (German)
SokaHH: Testen von Rich-Web-UI (German)
 
MEAN SCS in der Cloud
MEAN SCS in der CloudMEAN SCS in der Cloud
MEAN SCS in der Cloud
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
 
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
CodeTalks Vortrag: Automatisierung mit Ansible & Jenkins @ LeanIX Enterprise ...
 
Rapid Application Development mit Openobject
Rapid Application Development mit OpenobjectRapid Application Development mit Openobject
Rapid Application Development mit Openobject
 

Einführung in ASP.NET Core Middlewares

  • 2. 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
  • 3. 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
  • 5. Was ist eine Middleware? 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 5 Argonne National Laboratory CC BY-SA 2.0, @Wikimedia ?
  • 6. 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!"); });
  • 7. 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
  • 8. 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 }
  • 10. 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
  • 11. 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
  • 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
  • 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()
  • 18. Die Request-Pipeline aufbauen Ausführungsreihenfolge 26.06.2017 Matthias Jauernig - ASP.NET Core Middlewares 18 Quelle: ASP.NET Core Docs, Microsoft
  • 19. 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
  • 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
  • 23. 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); } }
  • 24. 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)
  • 27. 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
  • 28. 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
  • 31. 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
  • 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