1
Web APIs mit ASP.NET MVC Core 1
(vormals MVC 6)
Manfred Steyer
ManfredSteyer
Über mich …
 Manfred Steyer
 SOFTWAREarchitekt.at
 Trainer & Consultant
 Angular
 Server-Side .NET
Page  2
2
Ziel
Überblick über die Möglichkeiten für Web APIs
mit ASP.NET MVC Core 1
Folie 3
Didaktik
Folien
Beispiele
Folie 9
3
Inhalt
Warum ASP.NET Core 1?
Bootstrapping
Routing
Konfigurieren
Metadaten via Swagger
Folie 11
.NET Core
Folie 24
[http://www.hanselman.com/]
4
Vorteile
Folie 25
Cross-
Plattform
Side-by-
Side
Self-Hosting
F5-Compile-
to-Memory
Hosting
Kestrel (X-Plattform, Self-Host)
WebListener (Windows, Self-Host)
IIS  Kestrel
Nginx  Kestrel
Folie 26
5
Mehrgleisigkeiten
Web API MVC Web Pages
ASP.NET MVC Core 1
Vereinheitlichung von MVC, Web API
und (künftig) Web Pages
Einheitliche Konzepte für Controller, Views,
Dependency-Injection, Routing, Filters etc.
6
Migration
Code muss angepasst werden
Aber: Aktuelle Framework-Versionen werden
weiterhin gewartet
Keine Pläne für Migration von WCF und Web Forms
WCF Web Forms Web API 2MVC 5
.NET 4.x / "Full CLR"
ASP.NET CORE 1:
BOOTSTRAPPING
Page  34
7
Middleware-Komponenten
Folie 35
Server
Web-Framework
Web-Application
Middleware1
Middleware2
Middleware…
Middlewaren
Request
Response
Host-Process
HTTP
Pipeline konfigurieren
Folie 36
public class Startup
{
[…]
public void Configure(IApplicationBuilder app)
{
[…]
app.UseStaticFiles();
app.UseMvc();
[…]
}
}
8
Umgebung berücksichtigen
Folie 37
public void Configure(IApplicationBuilder app,
IHostingEnvironment env)
{
[…]
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
else {
app.UseExceptionHandler("/Home/Error");
}
[…]
}
Services konfigurieren
Folie 38
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
[…]
services.AddMvc()
[…]
}
[…]
}
9
DEMO
Page  40
WEB APIS MIT MVC CORE 1
Page  50
10
Web APIs in MVC Core 1
Kein eigenes Routing für Web APIs
Selbes Konzept, wie für MVC
Keine Konventionen für HTTP Verb,
wie GetAll()  GET, PostData()  POST
Routing berücksichtigt keine URL-Parameter. URL
muss eindeutig auf Action-Methode abbildbar sein!
Aber: WebApiCompatShim
Folie 51
Web API mit Attribut-basierten Routen
Folie 52
[Route("api/[controller]")]
public class FlightController: Controller
{
[HttpGet("{id}")]
public Flight GetById(int id) { […] }
[HttpGet("byRoute")]
public List<Flight> GetByRoute(string from, string to) { […] }
[HttpPost]
public void PostFlight([FromBody] Flight flight) { […] }
}
11
Web API mit Attribut-basierten Routen
Folie 53
[Route("api/[controller]")]
public class FlightController: Controller
{
// GET api/flight/{id}
[HttpGet("{id}")]
public Flight GetById(int id) { […] }
[HttpGet("byRoute")]
public List<Flight> GetByRoute(string from, string to) { […] }
[HttpPost]
public void PostFlight([FromBody] Flight flight) { […] }
}
Web API mit Attribut-basierten Routen
Folie 54
[Route("api/[controller]")]
public class FlightController: Controller
{
// GET api/flight/{id}
[HttpGet("{id}")]
public Flight GetById(int id) { […] }
// GET api/flight/byRoute?from=...&to=...
[HttpGet("byRoute")]
public List<Flight> GetByRoute(string from, string to) { […] }
[HttpPost]
public void PostFlight([FromBody] Flight flight) { […] }
}
12
Web API mit Attribut-basierten Routen
Folie 55
[Route("api/[controller]")]
public class FlightController: Controller
{
// GET api/flight/{id}
[HttpGet("{id}")]
public Flight GetById(int id) { […] }
// GET api/flight/byRoute?from=...&to=...
[HttpGet("byRoute")]
public List<Flight> GetByRoute(string from, string to) { […] }
// POST api/flight
[HttpPost]
public void PostFlight([FromBody] Flight flight) { […] }
}
DEMO
Page  56
13
MVC und Formatter konfigurieren
Folie 57
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => { […] })
.AddMvcOptions(options => { […] });
}
[…]
}
XML-Formatter
Package:
Microsoft.AspNetCore.Mvc.Formatters.Xml
 XmlDataContractSerializerInputFormatter
 XmlDataContractSerializerOutputFormatter
Folie 58
14
DEMO
Page  59
META-DATEN MIT SWAGGER
Page  60
15
Swagger
JSON-basiertes Metadatenformat für Web APIs
Weit verbreitet
Kein offizieller Standard
Folie 61
Swagger
Folie 62
JSON-Schema für Datentypen
Operationen (Verb, Url,
Datentypen für Anfrage und Antworten)
16
SWASHBUCKLE
Page  63
Swashbuckle
 Swagger-Implementierung für
ASP.NET MVC Core 1
 Installation via NuGet
 Startup.ConfigureServices:
 services.AddSwaggerGen();
 Startup.Configure
 app.UseSwaggerGen(); -- Swagger-Dokument via /swagger
 app.UseSwaggerUi(); -- Swaager-UI via /swagger/ui
Folie 64
17
DEMO
Page  65
SECURITY
Page  66
18
Authentifizierung via Benutzer/Passwort
HTTP-BASIC via IIS oder HttpListener
Eigene HTTP-Middleware
Folie 67
Authentication via Tokens
JwtBearerAuthentication-Middleware
Prüft JWT-Tokens
Übernimmt Claims des JWT-Token in User-Objekt
Folie 68
19
OAuth2: Prinzipieller Ablauf
Folie 69
Client
Authorization-Server
Resource-Server
3. Token
Details legt Flow fest Ein zentrales Benutzerkonto
Nur Auth-Svr. kennt Passwort
Auth. von Client entkoppelt
Flexibilität durch Token
SPA: Kein Cookie: Kein CSRF
DEMO
Page  70
20
Zusammenfassung
Folie 82
X-Plattform Routing Formatter
Swashbuckle Self-Hosting Vereinheitlichung
Middleware
manfred.steyer@SOFTWAREarchitekt.at
SOFTWAREarchitekt.at
ManfredSteyer
Kontakt

Web APIs mit ASP.NET Core 1

  • 1.
    1 Web APIs mitASP.NET MVC Core 1 (vormals MVC 6) Manfred Steyer ManfredSteyer Über mich …  Manfred Steyer  SOFTWAREarchitekt.at  Trainer & Consultant  Angular  Server-Side .NET Page  2
  • 2.
    2 Ziel Überblick über dieMöglichkeiten für Web APIs mit ASP.NET MVC Core 1 Folie 3 Didaktik Folien Beispiele Folie 9
  • 3.
    3 Inhalt Warum ASP.NET Core1? Bootstrapping Routing Konfigurieren Metadaten via Swagger Folie 11 .NET Core Folie 24 [http://www.hanselman.com/]
  • 4.
    4 Vorteile Folie 25 Cross- Plattform Side-by- Side Self-Hosting F5-Compile- to-Memory Hosting Kestrel (X-Plattform,Self-Host) WebListener (Windows, Self-Host) IIS  Kestrel Nginx  Kestrel Folie 26
  • 5.
    5 Mehrgleisigkeiten Web API MVCWeb Pages ASP.NET MVC Core 1 Vereinheitlichung von MVC, Web API und (künftig) Web Pages Einheitliche Konzepte für Controller, Views, Dependency-Injection, Routing, Filters etc.
  • 6.
    6 Migration Code muss angepasstwerden Aber: Aktuelle Framework-Versionen werden weiterhin gewartet Keine Pläne für Migration von WCF und Web Forms WCF Web Forms Web API 2MVC 5 .NET 4.x / "Full CLR" ASP.NET CORE 1: BOOTSTRAPPING Page  34
  • 7.
    7 Middleware-Komponenten Folie 35 Server Web-Framework Web-Application Middleware1 Middleware2 Middleware… Middlewaren Request Response Host-Process HTTP Pipeline konfigurieren Folie36 public class Startup { […] public void Configure(IApplicationBuilder app) { […] app.UseStaticFiles(); app.UseMvc(); […] } }
  • 8.
    8 Umgebung berücksichtigen Folie 37 publicvoid Configure(IApplicationBuilder app, IHostingEnvironment env) { […] if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } […] } Services konfigurieren Folie 38 public class Startup { public void ConfigureServices(IServiceCollection services) { […] services.AddMvc() […] } […] }
  • 9.
    9 DEMO Page  40 WEBAPIS MIT MVC CORE 1 Page  50
  • 10.
    10 Web APIs inMVC Core 1 Kein eigenes Routing für Web APIs Selbes Konzept, wie für MVC Keine Konventionen für HTTP Verb, wie GetAll()  GET, PostData()  POST Routing berücksichtigt keine URL-Parameter. URL muss eindeutig auf Action-Methode abbildbar sein! Aber: WebApiCompatShim Folie 51 Web API mit Attribut-basierten Routen Folie 52 [Route("api/[controller]")] public class FlightController: Controller { [HttpGet("{id}")] public Flight GetById(int id) { […] } [HttpGet("byRoute")] public List<Flight> GetByRoute(string from, string to) { […] } [HttpPost] public void PostFlight([FromBody] Flight flight) { […] } }
  • 11.
    11 Web API mitAttribut-basierten Routen Folie 53 [Route("api/[controller]")] public class FlightController: Controller { // GET api/flight/{id} [HttpGet("{id}")] public Flight GetById(int id) { […] } [HttpGet("byRoute")] public List<Flight> GetByRoute(string from, string to) { […] } [HttpPost] public void PostFlight([FromBody] Flight flight) { […] } } Web API mit Attribut-basierten Routen Folie 54 [Route("api/[controller]")] public class FlightController: Controller { // GET api/flight/{id} [HttpGet("{id}")] public Flight GetById(int id) { […] } // GET api/flight/byRoute?from=...&to=... [HttpGet("byRoute")] public List<Flight> GetByRoute(string from, string to) { […] } [HttpPost] public void PostFlight([FromBody] Flight flight) { […] } }
  • 12.
    12 Web API mitAttribut-basierten Routen Folie 55 [Route("api/[controller]")] public class FlightController: Controller { // GET api/flight/{id} [HttpGet("{id}")] public Flight GetById(int id) { […] } // GET api/flight/byRoute?from=...&to=... [HttpGet("byRoute")] public List<Flight> GetByRoute(string from, string to) { […] } // POST api/flight [HttpPost] public void PostFlight([FromBody] Flight flight) { […] } } DEMO Page  56
  • 13.
    13 MVC und Formatterkonfigurieren Folie 57 public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc() .AddJsonOptions(options => { […] }) .AddMvcOptions(options => { […] }); } […] } XML-Formatter Package: Microsoft.AspNetCore.Mvc.Formatters.Xml  XmlDataContractSerializerInputFormatter  XmlDataContractSerializerOutputFormatter Folie 58
  • 14.
    14 DEMO Page  59 META-DATENMIT SWAGGER Page  60
  • 15.
    15 Swagger JSON-basiertes Metadatenformat fürWeb APIs Weit verbreitet Kein offizieller Standard Folie 61 Swagger Folie 62 JSON-Schema für Datentypen Operationen (Verb, Url, Datentypen für Anfrage und Antworten)
  • 16.
    16 SWASHBUCKLE Page  63 Swashbuckle Swagger-Implementierung für ASP.NET MVC Core 1  Installation via NuGet  Startup.ConfigureServices:  services.AddSwaggerGen();  Startup.Configure  app.UseSwaggerGen(); -- Swagger-Dokument via /swagger  app.UseSwaggerUi(); -- Swaager-UI via /swagger/ui Folie 64
  • 17.
  • 18.
    18 Authentifizierung via Benutzer/Passwort HTTP-BASICvia IIS oder HttpListener Eigene HTTP-Middleware Folie 67 Authentication via Tokens JwtBearerAuthentication-Middleware Prüft JWT-Tokens Übernimmt Claims des JWT-Token in User-Objekt Folie 68
  • 19.
    19 OAuth2: Prinzipieller Ablauf Folie69 Client Authorization-Server Resource-Server 3. Token Details legt Flow fest Ein zentrales Benutzerkonto Nur Auth-Svr. kennt Passwort Auth. von Client entkoppelt Flexibilität durch Token SPA: Kein Cookie: Kein CSRF DEMO Page  70
  • 20.
    20 Zusammenfassung Folie 82 X-Plattform RoutingFormatter Swashbuckle Self-Hosting Vereinheitlichung Middleware manfred.steyer@SOFTWAREarchitekt.at SOFTWAREarchitekt.at ManfredSteyer Kontakt