Moderne Webanwendungen für.NET-Entwickler | 3 |
Impressum | 4 |
Inhalt | 5 |
Vorwort zur 3. Auflage | 23 |
Warum dieses Buch? | 23 |
Was ist der Inhalt dieses Buchs? | 24 |
Welche Voraussetzungen sollten Sie für dieses Buch mitbringen? | 25 |
Was ist das Ziel des Buchs? | 25 |
Welche Versionen werden in diesem Buch behandelt? | 26 |
Welche Programmiersprache wird in diesem Buch verwendet? | 27 |
Welche Werkzeuge werden in diesem Buch verwendet? | 27 |
Welche Sprachversion wird in diesem Buch verwendet? | 27 |
Woher bekommen Sie die Code-Beispiele und die drei Bonuskapitel zu diesem Buch? | 28 |
Wem ist zu danken? | 30 |
Die Autoren | 30 |
Über www.IT-Visions.de | 30 |
Dr. Holger Schwichtenberg | 31 |
Jörg Krause | 32 |
Dr. Joachim Fuchs | 33 |
Sebastian Kleinschmager | 33 |
Manfred Steyer | 33 |
Teil A - Web-Basiswissen | 35 |
Kapitel 1 - Protokolle, Standards und Konzepte | 37 |
Standardisierung | 37 |
RFCs | 37 |
World Wide Web Consortium (W3C) | 38 |
European Computer Manufacturers Association (ECMA) | 38 |
Hypertext Transfer Protocol (HTTP) | 38 |
Protokollaufbau, Header, Body | 39 |
Kommandoaufbau | 40 |
Methode oder Verb? | 40 |
Die HTTP-Statuscodes | 41 |
Ablauf einer HTTP-Kommunikation | 41 |
Kopffelder | 42 |
HTTP 2.0 | 43 |
Ergänzende Standards zu HTTP | 44 |
Web-Sockets | 44 |
WebDAV | 45 |
Simple Mail Transfer Protocol (SMTP) oder Extended SMTP (ESMTP) | 45 |
File Transfer Protocol (FTP) | 45 |
REpresentational State Transfer (REST) | 46 |
Webdienste | 46 |
Merkmale | 46 |
Adressierbarkeit | 46 |
Repräsentationsvariabilität | 46 |
Zustandslosigkeit | 47 |
Skalierbarkeit | 47 |
Allgemeingültigkeit | 47 |
Erweiterbarkeit | 47 |
REST-Beispiel | 47 |
URI | 48 |
HTTP-Methoden für REST | 49 |
Multipurpose Internet Mail Extensions (MIME) | 50 |
JavaScript Object Notation (JSON) | 51 |
Die JSON-Formatdefinition | 51 |
Atom Syndication Format (ATOM) | 52 |
Grenzen von REST: GraphQL und OData | 53 |
Single Page Application (SPA) | 53 |
Asynchronous JavaScript and XML (AJAX) | 54 |
Responsive Web Design (RWD) | 55 |
Kapitel 2 - Hypertext Markup Language (HTML) | 57 |
Grundlagen HTML | 57 |
Geschichte | 57 |
XML – Grundlage für HTML | 58 |
Markup | 59 |
XML-Dokumente | 59 |
Wohlgeformtheit | 59 |
Validierung | 60 |
Verarbeitung | 60 |
Der Begriff »Markup« | 60 |
Leere Elemente | 61 |
Gültigkeit | 62 |
Richtigkeit | 62 |
Spezialfälle | 63 |
Seitenaufbau | 63 |
Document Object Model (DOM) | 64 |
Der Dokumenttyp (Doctype) | 64 |
Codierungen | 64 |
HTML5-Seitenstruktur | 65 |
Elemente der Seite | 68 |
Textelemente | 68 |
h1 … h6 | 69 |
p | 69 |
pre | 69 |
blockquote | 69 |
figure und figcaption | 69 |
hr | 70 |
ol und li | 70 |
ul und li | 70 |
dl, dt, dd | 70 |
div | 70 |
Fließtextauszeichnung | 70 |
Verweise | 71 |
Tabellen | 71 |
Multimedia und Grafiken | 72 |
Formulare | 72 |
Skripte | 73 |
Interaktive Elemente | 73 |
Allgemeine und universelle Attribute | 73 |
id | 74 |
class | 74 |
accesskey | 75 |
contenteditable | 75 |
contextmenu | 76 |
dir | 76 |
draggable | 76 |
dropzone | 77 |
hidden | 77 |
lang | 77 |
spellcheck | 77 |
style | 78 |
tabindex | 78 |
title | 78 |
Kapitel 3 - Cascading Style Sheets (CSS) | 79 |
Grundlagen | 79 |
Syntax | 80 |
Selektor | 81 |
Elemente (Tags) | 81 |
ID | 81 |
Klassen | 81 |
Attribute | 82 |
Logische Auswahl | 82 |
Weitere Selektoren | 82 |
Pseudo-Selektoren | 84 |
Das Box-Modell | 85 |
Bausteine der Box | 86 |
Zählweise | 87 |
Ausnahmen | 87 |
Das Box-Modell in CSS3 | 87 |
Das Flexbox-Modell | 87 |
Prinzipien | 87 |
Eigenschaft der Container | 89 |
Beachtung von Medien | 90 |
Syntax | 90 |
Umgang mit Einheiten | 92 |
Parameter | 93 |
Der Viewport | 97 |
Viewport einstellen | 97 |
Parameter für den Viewport | 99 |
Einheiten | 99 |
Absolute Einheiten | 100 |
Typografische Angaben | 100 |
Empfehlung | 101 |
Relative Einheiten | 101 |
Kapitel 4 - Bootstrap | 103 |
Einführung in Bootstrap | 103 |
Neuerungen in Bootstrap 4 | 103 |
Globale Änderungen | 103 |
Rastersystem | 104 |
Tabellen | 104 |
Formulare | 104 |
Schaltflächen | 104 |
Klappmenüs | 104 |
Panels | 104 |
Sonstiges | 104 |
Installation | 104 |
CDN | 105 |
Bootstrap 4 | 105 |
Repository für lokale Installation | 105 |
Struktur der CSS-Dateien | 106 |
Minimizer | 107 |
Seitenaufbau | 107 |
Browserunterstützung | 108 |
ARIA | 109 |
HTML5 – Das role-Attribut | 109 |
Optimierung | 110 |
Interaktive Oberflächen | 111 |
Hilfsklassen | 112 |
Rahmen | 112 |
Reboot | 112 |
Schriftarten | 112 |
Struktur der Seite | 113 |
Einführung | 113 |
Der HTML5-Doctype | 113 |
Einstellungen des Ansichtsbereichs | 113 |
Zoom abschalten | 113 |
Das Rastersystem | 114 |
Container | 114 |
Das Raster im Detail | 114 |
Gerätespezifische Definitionen | 115 |
Änderung zu Bootstrap 3 | 116 |
Auto-Layout | 120 |
Das Flex-Raster | 123 |
Vorbereitung | 124 |
Gleichverteilte Spalten | 124 |
Horizontale Verteilungsoptionen | 125 |
Vertikale Verteilungsoptionen | 126 |
Sortieroptionen | 127 |
Typografie | 128 |
Überschriften | 129 |
Text und Textelemente | 130 |
Basisschrift | 130 |
Textelemente | 130 |
Elemente für Textblöcke | 131 |
Ausrichtung | 133 |
Blocksatz | 134 |
Transformationen | 134 |
Listen | 135 |
Tabellen | 137 |
Stile für Tabellen | 137 |
Spalten | 138 |
Lesbarkeit für Screenreader | 140 |
Responsive Tabellen | 142 |
Hilfsklassen | 146 |
Abstände kontrollieren | 146 |
Anzeigestatus erzwingen | 147 |
Formulare | 148 |
Struktur eines Formulars | 148 |
Einfache Formularelemente | 148 |
Eingabegruppen | 149 |
Einzeilige Formulare | 149 |
Label benutzen | 150 |
Formularelemente mit Bausteinen | 151 |
Größen | 152 |
Umgang mit Kontrollkästchen und Optionsfeldern | 153 |
Ergänzende Schaltflächen | 154 |
Horizontale Formulare | 157 |
Eingabeelemente | 158 |
Input-Elemente | 159 |
Select-Element | 161 |
Statische Texte im Formular | 162 |
Verhalten der Formularelemente | 163 |
Validierungsinformationen in Formularen | 164 |
Barrierefreiheit | 165 |
Formularelemente im Raster | 170 |
Anpassung der Feldhöhe | 171 |
Hilfetexte in Formularen | 172 |
Schaltflächen | 173 |
Semantische Schaltflächen | 174 |
Größe und Aussehen | 174 |
Zustände | 177 |
Weitere Bausteine | 178 |
Symbole | 178 |
Warum Symbolfonts? | 178 |
Alternativen | 178 |
Nutzung der Symbole | 179 |
Nutzung auf Schaltflächen | 180 |
Meldungen | 181 |
Häufige Symbole | 181 |
Responsive Bilder | 182 |
SVG und IE 8 bis 10 | 182 |
Eingebettete Quellen | 183 |
Farben und Hintergründe | 183 |
Textfarbe | 183 |
Hintergrundfarbe | 184 |
Ausrichtung von Elementen im Fluss | 185 |
Zentrieren | 185 |
Umbruch: Clearfix | 185 |
Inhalte anzeigen und verstecken | 186 |
Komponenten | 186 |
Klappmenüs (dropdown) | 187 |
Ausrichtung des Menüs | 188 |
Dekorationselemente | 188 |
Werkzeugleisten (toolbar) | 190 |
Vertikale Ausrichtung | 192 |
Allgemeine Optionen | 192 |
Schaltfläche mit Menü (button group) | 193 |
Einfache Schaltfläche mit Menü | 193 |
Geteilte Schaltfläche mit Menü | 194 |
Größen von Menüschaltflächen | 194 |
Spezielle Menüvarianten | 195 |
Navigation (nav, navbar) | 196 |
Tabulatoren (tabs) | 196 |
Navigationsschaltflächen (pills) | 197 |
Universelle Einstellungen | 198 |
Navigationsleiste (navbar) | 200 |
Standardnavigationsleiste | 204 |
Pfadnavigation (breadcrumb) | 204 |
Seitenweises Blättern (pagination) | 205 |
Seitenanzeige | 205 |
Unbestimmte Seitenzahl | 206 |
Größe | 207 |
Kennzeichnungen (tag) | 207 |
Kennzeichnungsplaketten (tag-pills) | 208 |
Neu in Bootstrap 4 | 208 |
Großbildleinwand (jumbotron) | 209 |
Seitenüberschriften (page header) | 210 |
Meldungen (alert) | 211 |
Fortschrittsbalken (progress) | 212 |
Medien (media) | 216 |
Ausrichtung | 216 |
Medienlisten | 216 |
Allgemeine Listen (list group) | 217 |
Plaketten in Listen | 217 |
Links in Listen | 218 |
Schaltflächen in Listen | 218 |
Karten (cards) | 221 |
Panels in Bootstrap 4 | 221 |
Überschriften | 221 |
Fußzeilen | 222 |
Karten mit Tabellen | 223 |
Karten mit Listen | 224 |
Karten mit Bildern | 224 |
Karten im Raster | 225 |
Kartenstapel (card decks) | 226 |
Kartengruppen (card groups) | 227 |
Karten in Spalten (card columns) | 228 |
Semantische Farben | 230 |
Aktive Komponenten | 231 |
Einrichtung und Aktivierung | 231 |
jQuery UI? | 232 |
Die Programmierschnittstelle | 232 |
Konfliktvermeidung | 232 |
Ereignisse | 233 |
Übergänge (transition) | 233 |
Animationen | 233 |
Modale Dialoge (modals) | 234 |
Eigenschaften | 234 |
Größen | 235 |
Dialog im Raster | 236 |
Allgemeines zum Verhalten | 240 |
Optionen | 240 |
Benutzung | 241 |
Klappmenü (dropdown) | 242 |
Allgemeines zum Verhalten | 242 |
Optionen | 242 |
Scrollbar-Überwachung (scrollspy) | 243 |
Affix | 243 |
Benutzung | 244 |
Optionen | 244 |
Angeheftete Navigation (affix) | 245 |
Umschaltbare Tabulatoren (tab) | 245 |
Benutzung | 245 |
Optionen | 247 |
Tooltips (tooltip) | 247 |
Mehrzeilige Links | 248 |
Allgemeine Tipps | 248 |
Optionen | 249 |
Inhaltsüberlagerung (popover) | 250 |
Anwendung | 250 |
Optionen | 252 |
Meldungen (alert) | 253 |
Optionen | 254 |
Interaktive Schaltflächen (button) | 254 |
Umschalter | 254 |
Optionen | 255 |
Inhaltseinblendung (collapse) | 255 |
Anwendung | 255 |
Inhaltsgruppen (accordion) | 256 |
Optionen | 258 |
Bilderkreisel (carousel) | 259 |
Anwendung | 259 |
Optionen | 260 |
Teil B - Webserverprogrammierung mit ASP.NET | 263 |
Kapitel 5 - ASP.NET MVC | 265 |
Geschichte und Verbreitung von ASP.NET | 265 |
Architektur von ASP.NET MVC | 266 |
Erste Schritte mit ASP.NET MVC | 267 |
ASP.NET-MVC-Projekt anlegen | 267 |
Projektaufbau | 269 |
Nuget-Pakete | 270 |
Modell anlegen | 271 |
Controller anlegen | 272 |
View anlegen | 274 |
Webanwendung testen | 279 |
Einträge editieren | 280 |
Vorschlagswerte über Drop-down-Listenfelder anbieten | 285 |
Controller | 288 |
Models entgegennehmen | 288 |
View auswählen | 290 |
Auf Ausnahmen reagieren | 291 |
URL-Mapping beeinflussen (Routing) | 291 |
Asynchrone Controller | 294 |
Vereinfachte Implementierung asynchroner Controller seit .NET 4.5 | 295 |
Views | 296 |
Razor | 296 |
Razor-Helper | 299 |
Layoutseiten | 299 |
Partielle Views | 301 |
Vorlagen für Felder und Models | 303 |
Views für mobile Anwendungen | 306 |
Zwischen unterschiedlichen Ansichten wechseln | 307 |
Minification und Bundling | 308 |
Models | 309 |
Metadaten im Model festlegen | 309 |
HTML-Text übermitteln | 310 |
Validieren von Benutzereingaben | 310 |
Manuelles Validieren | 310 |
Deklaratives Validieren | 311 |
Globalisierung | 316 |
Sprach- und Ländereinstellungen festlegen | 316 |
Über Ressourcedateien mehrsprachige Inhalte bereitstellen | 318 |
Codierung festlegen | 319 |
Areas | 320 |
Filter | 322 |
Überblick | 323 |
Umsetzung | 323 |
Filter auf Controller und Action-Methoden anwenden | 325 |
Globale Filter | 326 |
Authentifizierungsfilter | 326 |
Kapitel 6 - ASP.NET Web API | 329 |
Einen einfachen HTTP-Service erstellen | 329 |
Parameter und Rückgabewerte | 330 |
HTTP-Services konfigurieren | 332 |
HTTP-Services mit Fiddler testen | 334 |
Mehr Kontrolle über HTTP-Nachrichten | 335 |
Antworten mit HttpResponseMessage beeinflussen | 335 |
Anfragen als HttpRequestMessage darstellen | 337 |
HttpRequestMessage und HttpResponseMessage am Beispiel Conditional Get | 338 |
Antworten über IHttpActionResult zurückgeben | 339 |
HTTP-Services über HttpClient konsumieren | 340 |
Routing | 343 |
Benutzerdefinierte Routen über die Konfiguration festlegen | 343 |
Attributbasiertes Routing | 344 |
Weiterführende Schritte mit der Web API | 347 |
Dynamische Parameter | 348 |
Tracing | 349 |
Request Batching | 350 |
Cross Origin Resource Sharing (CORS) | 352 |
Validieren | 353 |
Querschnittsfunktionen implementieren | 354 |
Message-Handler | 354 |
Einen Handler umsetzen | 354 |
Handler mit HttpClient verwenden | 355 |
Filter | 357 |
Überblick | 357 |
Filter umsetzen | 358 |
Filter als Attribute einsetzen | 359 |
Filter über FilterProvider bereitstellen | 360 |
Filter als globale Filter registrieren | 361 |
Schnittstellen für Filter | 361 |
Authentifizierungsfilter | 361 |
Filterüberschreibungen | 364 |
Benutzerdefinierte Formate unterstützen | 364 |
Formatter implementieren | 365 |
Formatter mit HttpClient verwenden | 367 |
Serialisierung beeinflussen | 368 |
JSON-Serializer konfigurieren | 368 |
XML-Serializer konfigurieren | 369 |
Eigenschaften von der Serialisierung ausschließen | 369 |
Zirkuläre Referenzen serialisieren | 370 |
Binary JSON (BSON) | 372 |
Web API und HTML-Formulare | 372 |
Einfache Formularfelder übermitteln | 372 |
Datei-Upload via HTML-Formular | 373 |
Fortschritt ermitteln | 375 |
Feingranulare Konfiguration | 377 |
Controllerbasierte Konfiguration | 377 |
Routenbasierte Konfiguration | 378 |
Kapitel 7 - ASP.NET SignalR | 379 |
Long-Polling | 379 |
Web-Sockets | 380 |
Überblick über ASP.NET SignalR | 381 |
PersistentConnection | 382 |
Erste Schritte mit SignalR und PersistentConnection | 382 |
Lifecycle-Methoden | 383 |
URL-Mapping für persistente Verbindungen | 383 |
Einfacher Client für eine persistente Verbindung | 384 |
Einfacher JavaScript-Client für eine persistente Verbindung | 385 |
Hubs | 387 |
Methoden und Callbacks mit SignalR und Hubs | 387 |
URL-Mapping für Hubs | 389 |
Lifecycle-Methoden | 389 |
Hubs konsumieren | 389 |
Hubs über JavaScript konsumieren | 391 |
Gruppen | 395 |
Pipeline-Module für Querschnittsfunktionen | 396 |
SignalR konfigurieren | 398 |
Cross Origin Resource Sharing (CORS) | 398 |
SignalR skalieren | 398 |
Überlegungen zum Skalieren von SignalR | 399 |
SignalR mit SQL Server skalieren | 400 |
Implementierung eines SignalR-Clients | 402 |
Das Skalierungsszenario testen | 403 |
Azure Service Bus und Redis als Alternative zu SQL Server | 404 |
Kapitel 8 - ASP.NET-Programmierschnittstellen | 405 |
Direkt mit HTTP interagieren | 405 |
HttpContext | 405 |
Server (HttpServerUtility) | 407 |
Request (HttpRequest) | 408 |
Response (HttpResponse) | 410 |
Zustandsverwaltung auf Sitzungsebene | 411 |
Überblick | 412 |
Weitere Optionen | 413 |
Programmieren mit dem Sitzungszustand | 414 |
URL-basierte Sitzungsverwaltung ohne Cookies | 414 |
Konfiguration des Sitzungszustands | 415 |
Speicherort der Sitzungstabelle wählen | 416 |
Komprimierung des Sitzungszustands | 417 |
Deaktivieren des Sitzungszustands | 417 |
Caching | 417 |
Überblick | 418 |
Pro und Contra der Zwischenspeicherung | 418 |
Zwischenspeicherung ganzer Seiten (Output-Caching) | 419 |
Zwischenspeicherungsprofile (Caching Profiles) | 421 |
Caching von Seitenteilen (Fragmentzwischenspeicherung) | 421 |
Programmatisches Caching | 422 |
Cacheinvalidierung | 423 |
Cacheinvalidierung durch die Datenbank | 424 |
Cache Invalidation bei Microsoft SQL Server 7.0 und 2000 | 424 |
Cacheinvalidierung bei Microsoft SQL Server ab Version 2005 | 425 |
Teil C - Webserverprogrammierung mit ASP.NET Core | 427 |
Kapitel 9 - Einführung in ASP.NET Core | 429 |
Klassisches ASP.NET oder ASP.NET Core? | 429 |
Einführung in die Core-Welt | 430 |
.NET Standard | 431 |
Windows Compatibility Pack für .NET Core | 436 |
Open Source | 439 |
Dokumentation | 439 |
Werkzeuge | 442 |
Kommandozeilenwerkzeug dotnet | 442 |
Editoren | 444 |
Erste Schritte mit ASP.NET Core (auf .NET Core) | 444 |
Installation | 444 |
Projekt anlegen | 445 |
Projektaufbau | 448 |
Die Klasse Program | 449 |
Klasse Startup und Middleware | 452 |
Referenzen/Pakete | 454 |
Übersetzen und Debugging | 457 |
Deployment | 460 |
ASP.NET Core auf dem klassischen .NET Framework | 463 |
Einsatzszenarien | 463 |
Anlegen von ASP.NET-Core-Projekten mit dem klassischen .NET Framework | 464 |
Projektaufbau | 464 |
Referenzen/Pakete | 466 |
Deployment | 467 |
In ASP.NET Core integrierte Webserver: Kestrel versus HTTP.sys (WebListener) | 469 |
Kestrel | 469 |
HTTP.sys | 470 |
Kapitel 10 - ASP.NET Core MVC und Razor Pages | 473 |
POCO-Controller | 474 |
Controller und View | 475 |
Tag Helper | 476 |
Wie funktionieren Tag Helper? | 476 |
Eingebaute Tag Helper | 477 |
Eigene Tag Helper | 478 |
Beispiel: Tag | 479 |
Beispiel: Tag |
| 480 |
Beispiel: Tag | 482 |
Beispiel: Tag | 482 |
View Components | 484 |
Razor Pages | 486 |
Von Webforms über MVC zu Razor Pages | 487 |
Razor Pages versus MVC | 488 |
Page Model als Code-Behind | 489 |
URL-Parameter | 490 |
Eingebaute Objekte | 492 |
Datenbindung | 493 |
Praxisbeispiel zu Razor Pages | 494 |
Drittanbieterkomponenten für ASP.NET Core | 502 |
Kapitel 11 - ASP.NET-Core-Klassenbibliotheken | 503 |
Dependency Injection in ASP.NET Core | 504 |
Implementierung eines Diensts | 505 |
Registrierung von Diensten | 506 |
Injektion in einen Konstruktor | 507 |
Manuelle Beschaffung | 507 |
Injektion in eine View | 508 |
Vordefinierte Dienste der ASP.NET-Core-Infrastruktur | 508 |
Konfiguration in ASP.NET Core | 509 |
Sitzungen in ASP.NET Core | 511 |
Cookies | 514 |
URL-Rewriting in ASP.NET Core | 514 |
Benutzerverwaltung und Authentifizierung | 517 |
Kapitel 12 - ASP.NET Core Web APIs | 521 |
Die Grundlagen von ASP.NET Core Web API | 521 |
Abfragen von Daten | 521 |
Arbeiten mit Statuscodes | 524 |
Anlegen, Aktualisieren und Löschen von Daten | 525 |
Nutzung von Sub-Routen für Teil-Ressourcen | 528 |
Nutzung weiterer Model-Binding-Funktionen | 529 |
Anbieten unterschiedlicher Repräsentationen von Ressourcen | 531 |
Nutzung des PATCH-Verbs mit JSON-Patch | 531 |
Cross Origin Resource Sharing | 533 |
Bereitstellung von OpenAPI-Beschreibungen über Swagger | 535 |
Starten von Hintergrundprozessen über IHostedService | 538 |
Integrationstests mithilfe des TestHosts | 539 |
Service-Kommunikation mit HttpClient | 540 |
Abfragen von Daten | 540 |
Versenden von Daten und Reaktion auf Statuscodes | 542 |
Arbeiten mit Headern und HttpRequestMessage | 543 |
Generieren von Clients für Swagger-Spezifikationen | 543 |
Ausblick auf Neuerungen durch ASP.NET Core 2.1 | 544 |
Annotation [ApiController] | 544 |
ActionResult-Rückgabewerte | 545 |
Optimierte Input-Verarbeitung | 545 |
Unterstützung von Problemdetails für HTTP-APIs | 546 |
JSON-Patch-Erweiterungen | 547 |
Kapitel 13 - Microservices mit ASP.NET Core Web API und RabbitMQ | 549 |
Grundlagen von Microservices | 549 |
Mögliche Vorteile von Microservices | 551 |
Mögliche Nachteile von Microservices | 552 |
Modellierung von Microservices | 553 |
Integration und Kommunikation von Microservices | 554 |
Synchrone und asynchrone Kommunikation | 554 |
Messaging-basierte versus Request-Response-Kommunikation | 555 |
Gesteuerte (orchestriert) versus Event-getriebene Kommunikation (choreografiert) | 556 |
.NET-Core-Technologien zur Umsetzung von Service- Kommunikation | 557 |
Asynchrone Service-Kommunikation über RabbitMQ | 557 |
Das Producer-Consumer-Modell | 557 |
Das Publish-Subscribe-Modell | 562 |
Microservices-Fallstudie | 564 |
Umgebung und fachlicher Kontext | 565 |
Der HumanResourcesService | 566 |
Abfragen von Mitarbeiterdaten | 567 |
Einbinden des DbContexts | 568 |
Der ProjectsService | 568 |
Replikation der Kundendaten aus dem CRM | 569 |
Erzeugen von neuen Projekten | 570 |
Zuweisen eines Mitarbeiters zu einem Projekt | 572 |
Eingabe eines täglichen Reports über geleistete Stunden | 574 |
Abschluss eines Projekts | 576 |
Übersichtsdiagramm des ProjectsService | 577 |
Der ManagementDashboardService | 577 |
Aktualisieren der aktuellen Umsatzprognose | 578 |
Übersichtsdiagramm des ManagementDashboardService | 579 |
Der InvoicingService | 579 |
Verarbeitung einer Rechnung für ein abgeschlossenes Projekt | 579 |
Übersichtsdiagramm des InvoicingService | 583 |
Fazit | 584 |
Nützliche Patterns und Best-Practices im Bereich Microservices | 584 |
Resilienz-Patterns | 585 |
Der Retry-Mechanismus | 585 |
Timeouts und das Problem blockierter Threads | 587 |
Circuit-Breaker | 588 |
Transaktionalität und Datenkonsistenz | 589 |
Serviceübergreifender Code und serviceübergreifende Funktionen | 592 |
Nuget-Pakete | 592 |
Nutzung von Middleware | 592 |
Zentrale Services | 593 |
Fazit und weitere Literatur | 593 |
Kapitel 14 - ASP.NET Core SignalR | 595 |
Hub-Klassen | 595 |
Hub-Client mit .NET Core 2.1 | 597 |
Hub-Client mit Angular | 598 |
Serverseitig initiierte Benachrichtigungen und Gruppen | 603 |
Teil D - Web-Client-Programmierung | 609 |
Kapitel 15 - JavaScript-Grundlagen | 611 |
Grundlagen der Sprache | 611 |
Sprachmerkmale und Entwurfsmuster | 612 |
Vergleich mit Programmiersprachen | 612 |
JavaScript-Syntax | 612 |
Einbetten in HTML | 613 |
Kommentare | 613 |
Literale | 614 |
Umlaute | 614 |
Numerische und boolesche Literale | 614 |
Sonstige Literale | 615 |
Operatoren | 615 |
Typen | 616 |
Automatische Typkonvertierung | 616 |
Number | 616 |
Berechnungen mit Math | 617 |
Weitere Funktionen | 619 |
Konstanten | 620 |
Zeichenkette (String) | 621 |
Vorlagenzeichenfolgen | 622 |
Die String-Methoden | 623 |
Nicht standardkonforme String-Methoden | 626 |
Boolean | 626 |
Objekte | 627 |
Das Objekt-Literal {} | 627 |
Spezielle Typen | 627 |
null versus undefined | 628 |
Symbole | 628 |
Arrays | 628 |
Einige Methoden für Arrays | 629 |
Spezialfunktionen statt Klassen | 629 |
Operatoren | 630 |
Operatoren für Objekte | 630 |
Spread-Operator | 631 |
Vergleichsoperatoren | 631 |
Anweisungen – Statements | 632 |
Kontrollstrukturen: if – else | 633 |
Kontrollstrukturen: switch – else – default | 633 |
Umgang mit break | 633 |
Kontrollstrukturen: Schleifen | 633 |
while | 633 |
do | 634 |
for | 634 |
foreach | 635 |
Schleifenkontrolle | 635 |
Verschachtelung von Schleifen | 636 |
Schleifen mit for..in | 637 |
Schleifen mit for..of | 637 |
Polyfill erforderlich | 638 |
Fehlerbehandlung | 638 |
Ausnahmen (Exceptions) | 638 |
Standardausnahmeobjekte | 639 |
Variablen und Scope | 640 |
Scope – der Sichtbarkeitsbereich | 640 |
Variablen mit let und const | 640 |
Das return-Schlüsselwort | 641 |
Objektorientierung | 641 |
Erstellen von Objekten | 641 |
Deklaration mit new | 641 |
Deklaration mit der Literalnotation | 642 |
JSON (JavaScript Object Notation) | 642 |
Klassen | 643 |
Der Konstruktor | 643 |
Klassische Konstruktor-Funktionen | 644 |
Der Konstruktor constructor | 646 |
Methoden und Eigenschaften | 646 |
Umgang mit Eigenschaften | 646 |
Private Variablen und Funktionen | 647 |
Privilegierte Funktionen | 648 |
Statische Mitglieder | 649 |
Vererbung | 649 |
Prototyping | 649 |
Objektabstammung | 650 |
Die Basismethoden | 651 |
Objektvererbung | 651 |
Vererbung mit extends | 652 |
Umgang mit prototype und __proto__ | 653 |
Die Objektvererbung mittels __proto__-Prototype | 653 |
Exkurs Objekthierarchie | 653 |
Umgang mit this | 653 |
Bindungen | 655 |
Bindungen berücksichtigen | 656 |
Explizite Bindungen | 658 |
Ableiten von internen Typen | 659 |
Tipps zum Umgang mit objektorientierten Techniken | 659 |
Globale Standardfunktionen | 660 |
Timer-Funktionen | 660 |
Einsatzfälle | 660 |
Beispiele | 660 |
Prüffunktionen | 661 |
Konvertierungsfunktionen | 661 |
Module | 662 |
Entwurfsmuster | 662 |
Einfache Module | 663 |
Privater Funktions-Scope | 664 |
Öffentliche Schnittstellen | 665 |
Instanzen von Modul-Objekten | 666 |
Globale Objekte | 667 |
Erweiterbare Module | 667 |
Reihenfolgen sichern | 668 |
Namensräume | 668 |
Zusammenfassung | 669 |
Module | 669 |
Funktionen | 669 |
Pfeilfunktionen (Lambdas) | 669 |
Funktionsrumpf | 671 |
Rückgabe von Objekt-Literalen | 671 |
Zeilenumbruch | 671 |
Übersetzungsreihenfolge | 671 |
Verwendung von new | 672 |
Verwendung von yield | 672 |
Erweiterte Objektliterale | 672 |
Destrukturierung | 672 |
Umgang mit Argumenten | 673 |
Standardargumente | 673 |
Argument-Arrays | 673 |
Rest-Parameter | 674 |
Generatoren und Iteratoren | 674 |
Generatoren | 674 |
yield | 675 |
Iteratoren | 675 |
Iteratoren für Daten | 676 |
Asynchrone Programmierung | 677 |
Klassische asynchrone Programmierung | 677 |
Asynchrone Funktionen | 678 |
Continuation Passing Style (CPS) | 679 |
Fehlerbehandlung | 681 |
Promise | 684 |
Natur des Promise | 684 |
Syntax und API | 684 |
Promises erzeugen | 685 |
Gruppen | 686 |
Fehlerbehandlung | 687 |
Set und Map | 688 |
Set | 688 |
Map | 690 |
Schlüsselvergleiche | 690 |
Iteratoren | 691 |
WeakMap und WeakSet | 692 |
Reguläre Ausdrücke | 692 |
Einführung | 692 |
Kopieren oder Konstruieren? | 693 |
Und wie funktioniert das? | 693 |
Auflösungshilfen | 694 |
Literale | 694 |
Zeichenklassen | 695 |
Referenzen | 695 |
Metazeichen | 695 |
Anfang, Ende und Grenzen | 695 |
Ein beliebiges Zeichen | 696 |
Ohne Zeichen | 697 |
Zeichenklassen | 697 |
Einer aus vielen | 697 |
Negation | 698 |
Ziffern | 698 |
Datum und Zeit | 698 |
Zeichenketten | 699 |
Abkürzungen | 699 |
Wiederholungsoperatoren | 699 |
Allgemeine Wiederholungsoperatoren | 700 |
Auf einen Blick | 701 |
Referenzen | 701 |
Gruppierungen | 702 |
Einfache Gruppen | 702 |
Umschließende Zeichen | 702 |
Vorwärtsreferenzen | 703 |
Die JavaScript-Funktionen | 704 |
Das RegExp-Objekt | 704 |
Methoden | 704 |
Eigenschaften | 705 |
Dynamische Eigenschaften | 706 |
Literal-Schreibweise direkt nutzen | 706 |
Verarbeitungsoptionen | 707 |
Zeichenkettenfunktionen | 707 |
Übersicht | 707 |
Zusammenfassung | 708 |
Reflektions-API | 710 |
Einfache Methoden | 710 |
Reflect | 710 |
Erzeugerfunktionen | 711 |
Operatoren für Schlüsselwörter | 711 |
Dynamische Argumentlisten | 712 |
Funktionsaufrufe | 712 |
Proxy-Fallen | 712 |
Zusammenfassung der Reflect-Methoden | 713 |
Stellvertreter: Proxies | 714 |
Einführung | 714 |
Proxy-Fallen anwenden | 715 |
get | 715 |
set | 716 |
Schemaprüfung mit Proxies | 717 |
Entfernbare Proxies | 718 |
Übersicht | 719 |
Kapitel 16 - TypeScript | 721 |
Geschichte von TypeScript | 721 |
Open-Source-Projekt | 722 |
TypeScript-Compiler | 722 |
Übersetzung von TypeScript in JavaScript | 723 |
TypeScript Playground | 724 |
TypeScript in Visual Studio | 725 |
TypeScript-Kommandozeilencompiler tsc | 728 |
TypeScript in Visual Studio Code | 729 |
TypeScript in Gulp | 730 |
Datentypen | 732 |
Arrays und Tupel | 734 |
Klassen | 735 |
Generische Klassen | 737 |
Strukturelle Typäquivalenz (Duck Typing) | 738 |
Funktionen und Lambda-Ausdrücke | 738 |
Dekoratoren | 740 |
Module und Verweise | 741 |
TypeScript ohne externes Modulsystem (interne Module) | 741 |
Externe Module | 742 |
Re-Export | 744 |
Deklarationsdateien | 744 |
Einbindung von Deklarationsdateien (altes Verfahren) | 745 |
Import von Deklarationsdateien | 745 |
Deklarationsdateien und tsconfig.js | 745 |
Mixins | 746 |
Mixin-Konstruktortypen | 748 |
Deklaratives Mischen | 749 |
Module mischen | 750 |
Nicht mögliche Vermischungen | 753 |
Reflektion: Metadaten per Programmcode | 753 |
Die Metadaten-API für Reflektion | 754 |
Ermitteln von Typinformationen | 754 |
Ermitteln von Parameterinformationen | 755 |
Ermitteln von Rückgabeinformationen | 755 |
Asynchrone Programmierung | 755 |
Generatoren und Iteratoren | 756 |
Iteratoren | 756 |
Generatoren | 757 |
Asynchrone Iteration | 757 |
Asynchrone Generatoren | 758 |
Kapitel 17 - Angular | 759 |
Ziele und Architektur von Angular | 759 |
Browserunterstützung | 760 |
Veröffentlichungszyklus von Angular | 761 |
Dokumentation | 762 |
Beispielsammlung | 763 |
Komponenten | 765 |
Datenbindung und Pipes | 768 |
Syntaxübersichten | 770 |
Strukturelle Direktiven | 770 |
Datenbindungssyntax | 771 |
Angular-Pipes | 771 |
Module | 772 |
Formulare | 773 |
Routing | 776 |
Dienste und Dependency Injection | 778 |
Animationen | 779 |
Werkzeuge | 779 |
JiT vs. AOT | 780 |
Angular Universal | 782 |
Kapitel 18 - ASP.NET Blazor | 783 |
Silverlight wurde eingestellt | 783 |
Web Assembly | 783 |
Architektur von Blazor | 784 |
Erste Schritte mit ASP.NET Blazor | 785 |
Beispielprojekt | 786 |
Weitere Möglichkeiten | 789 |
Ausblick | 789 |
Teil E - Hosting von ASP.NET und ASP.NET Core | 791 |
Kapitel 19 - Internet Information Services (IIS) | 793 |
Versionsgeschichte | 793 |
Kernfunktionen des IIS | 794 |
Installation des IIS | 795 |
Modularisierung | 797 |
Skriptbasierte Installation | 798 |
Integration zwischen ASP.NET und IIS | 799 |
Test der Installation | 799 |
IIS Express | 800 |
IIS-Administration | 801 |
IIS-Manager | 802 |
Administration per Kommandozeile und Skript | 803 |
IIS-Websites (virtuelle Webserver) | 803 |
Websites erstellen | 804 |
Websites erstellen per Skript | 805 |
Wichtige Einstellungen für Websites | 807 |
Beschränken der möglichen Clients | 807 |
Authentifizierung | 808 |
Transport Layer Security (TLS)/Secure Socket Layer (SSL) | 809 |
Server für Nicht-HTTP-Protokolle | 811 |
Virtuelle Verzeichnisse im IIS | 811 |
IIS-Anwendungen | 813 |
Rahmenbedingungen einer IIS-Anwendung | 813 |
Anlegen einer IIS-Anwendung | 814 |
IIS-Anwendungspools | 815 |
Eigenschaften eines Anwendungspools | 815 |
Liste der Anwendungspools | 816 |
Zuordnung von Websites und IIS-Anwendungen zu Anwendungspools | 816 |
ASP.NET-Version | 817 |
Erweiterte Einstellungen für Anwendungspools | 818 |
Anwendungspoolidentität | 819 |
Wiederverwendung (Recycling) | 819 |
Leistungseinstellungen | 820 |
Zustandsüberwachung | 821 |
Besonderheiten für ASP.NET-Anwendungen | 821 |
IIS-Autostart | 821 |
IIS-Verarbeitungspipeline | 824 |
Kapitel 20 - Microsoft Azure | 827 |
Azure-Konzepte | 827 |
Anlegen einer Subscription | 828 |
Anlegen einer Ressource Group | 828 |
Anlegen eines App Service Plans | 829 |
Anlegen eines Azure App Service | 830 |
Anlegen eines Azure App Service mit der PowerShell | 833 |
Kapitel 21 - Verteilen von Webanwendungen aus Visual Studio heraus | 835 |
Web Deploy-Werkzeug | 835 |
Web Deploy in einen IIS-Webserver | 836 |
Web Deploy nach Azure | 838 |
Konfigurationstransformationen | 839 |
Erstellen der Transformationsdateien | 839 |
Syntax der Transformationsdateien | 839 |
Ergebnis der Transformation | 841 |
Continuous Integration und Continuous Delivery | 841 |
Kapitel 22 - Webanwendungen in Docker | 843 |
Docker auf Windows | 843 |
Installation der Docker-Unterstützung von Microsoft | 845 |
Installation von Docker for Windows | 847 |
Ein Image beschaffen | 848 |
Einen Container starten | 849 |
Ein Visual-Studio-Container-Projekt erstellen | 850 |
Debugging eines Containers | 851 |
Verwendung des Containers | 851 |
Images aus Containern erstellen | 855 |
.NET Core-Container | 855 |
Container in Windows Server 2016 hosten | 858 |
Images verbreiten | 859 |
Teil F - Fallbeispiel: MiracleList | 863 |
Kapitel 23 - Das Fallbeispiel »MiracleList« | 865 |
Das Szenario | 865 |
Links | 868 |
Kapitel 24 - Das MiracleList-Backend | 869 |
Architektur | 871 |
Entitätsklassen | 874 |
Entity Framework Core-Kontextklasse | 876 |
Lebensdauer der Kontextklasse in ASP.NET Core- Anwendungen | 877 |
Geschäftslogik | 878 |
Web API | 887 |
Kapitel 25 - MiracleList-Web-Client | 899 |
Technikeinsatz im Web-Client | 899 |
Angular-CLI | 900 |
Webserver starten | 902 |
Zusatzkomponenten | 903 |
Proxy für REST-Dienste | 904 |
Daten darstellen | 905 |
Navigation zu den Aufgaben | 907 |
Datumsanzeigen | 910 |
Zeilenumbrüche | 912 |
Aufgabenstatus ändern | 912 |
Aufgaben anlegen | 915 |
Suchfunktion | 916 |
Komponentenbildung | 917 |
Schritt 1: Routing-Modul | 919 |
Schritt 2: Kommunikationsdienst | 919 |
Schritt 3: Teilaufgabenliste in SubTaskList-Komponente | 920 |
Schritt 4: Auslagerung in TaskView | 922 |
Schritt 5: Aufgaben bearbeiten | 924 |
Schritt 6: Integration in AppComponent | 925 |
Datepicker | 926 |
Kontextmenü verwenden | 927 |
Nachfragen beim Löschen | 930 |
Animationen | 931 |
Sortieren der Aufgabenliste | 932 |
Benutzeranmeldung | 933 |
Hauptmenü | 935 |
Testen | 936 |
Auslieferung | 939 |
Kapitel 26 - MiracleList-Electron-Client | 941 |
Hybride Apps | 942 |
Architektur von Electron | 942 |
Electron-Projekt anlegen | 943 |
Kommunikation zwischen Main und Renderer | 952 |
Erweiterungen in der Webanwendung | 952 |
Start der Electron-Anwendung | 955 |
Debugging | 956 |
Deployment | 957 |
Kapitel 27 - MiracleList-Cordova-Client | 959 |
Architektur von Cordova | 960 |
Cordova-Projekt anlegen | 961 |
Cordova-Anwendung starten | 963 |
Erweiterungen in der Webanwendung | 964 |
Cordova-APIs verwenden | 965 |
Plug-ins verwenden | 966 |
Responsive Web Design mit Bootstrap | 969 |
Index | 971 |