In diesem Artikel werden Webdienstprotokolle, gängige Datenaustauschformate und bewährte Methoden beschrieben. Wenn Sie daran interessiert sind, performante mobile Anwendungen zu erstellen, die eine Verbindung zum Internet herstellen, lesen Sie weiter!
Die Auswahl eines geeigneten Protokoll- und Datenaustauschformats zum Übertragen von Daten zwischen Ihrer mobilen App und dem Internet ist eine der wichtigsten Entscheidungen während des Entwicklungsprozesses. Die am häufigsten verwendeten und am häufigsten verwendeten Protokolle sind REST, XML-RPC und SOAP.
Alle diese Protokolle transportieren Daten über das HTTP-Protokoll. Die XML-RPC- und SOAP-Protokolle basieren auf XML, während REST-Dienste auf unterschiedliche Datenformate zurückgreifen können. Die beiden gebräuchlichsten sind XML und JSON. Insbesondere SOAP wird von Unternehmensanwendungen sehr geschätzt und angenommen, da es strikte Datenmodelle durchführt und öffentliche Schnittstellen durch WSDL beschreibt. Dadurch können einige Entwicklungswerkzeuge (wie Microsoft Visual Studio für .NET) automatisch Objekte und Methoden einrichten, die verwendet werden sollen die Services einfach durch Hinzufügen eines Verweises auf die Service-WSDL zum Projekt.
XML ist jedoch um einiges weniger effizient als JSON, wenn in einem bandbreitenbeschränkten Netzwerkszenario wie der mobilen Entwicklung gearbeitet wird. Mobile Datennetzwerke (WWANs) sind in der Regel weniger zuverlässig als verdrahtete (LAN) oder drahtlose (WLAN) Netzwerke, da sich mobile Clients leicht innerhalb und außerhalb der Versorgungsbereiche befinden. Außerdem abonnieren einige Benutzer keine "flachen" Datentarife und werden tatsächlich vom Netzwerkverkehr belastet.
Bei der Entwicklung für Mobilgeräte sollten Sie daher immer auf Einfachheit und Verkehrsreduzierung setzen.
Vergleichen wir einfaches XML mit JSON mit einer Beispielantwort:
XML
Hallo, Gerät!
JSON
returnValue: "Hallo, Gerät!"
Wie du siehst, JSON trägt eine kleinere Nutzlast Es muss nur die Daten mit Klammern (geschweifte Objekte, quadratische Felder für Arrays) und Anführungszeichen umbrochen werden, während XML für jedes Element oder jede Gruppe einen vollständigen Stammknoten und Tags zum Öffnen und Schließen benötigt. Durch das Speichern dieser Tags kann die Antwortnutzlast erheblich reduziert werden. Je mehr Daten übertragen werden, desto größer ist der "Padding" der Nutzlast mit XML.
Darüber hinaus erfordern SOAP und XML-RPC komplexere XML-Datenstrukturen (wie den SOAP-Umschlag), wodurch die Nutzlast zusätzlich gewichtet wird.
Aus diesem Grund empfehle ich die Wahl JSON für das Datenaustauschformat Ihrer App und SICH AUSRUHEN für das Übertragungsprotokoll, es sei denn, XML, SOAP oder XML-RPC werden explizit für Ihre Anforderungen benötigt. Wenn Sie ein Datenmodell durchsetzen müssen, können Sie dies auch mit JSON erreichen, indem Sie das JSON-Schema oder WSDL 2.0 verwenden.
Weitere Informationen zu den behandelten Protokollen und Datenformaten finden Sie hier:
Da die meisten Webdienste über öffentliche Netzwerke betrieben werden, ist der Schutz der Daten, die zwischen den Diensten und der App ausgetauscht werden, eines der kritischsten Probleme, die Sie ansprechen müssen. Viele Webdienste bieten authentifizierten Benutzern Remotefunktionalität, sodass private Benutzerdaten und Authentifizierungsnachweise auch über das Netzwerk übertragen werden müssen.
Persönliche Daten, Kontodaten und Anmeldeinformationen sollten noch nie Reisen Sie in Klartext über ein öffentliches Netzwerk. Dies bedeutet, dass Ihre Web Services und Apps Kryptografie implementieren sollten. Die gute Nachricht ist, dass die meisten gängigen Protokolle Daten über HTTP übertragen, sodass Sie sich darauf verlassen können bekannt, vertrauenswürdig und robust HTTP-SSL / TLS-Protokoll (HTTPS), das weit verbreitet ist und sowohl serverseitig als auch clientseitig unterstützt wird.
Die Aktivierung von SSL auf gängigen Webservern ist relativ einfach (für Apache, IIS und Nginx gibt es viele nützliche Ressourcen). Sie müssen lediglich ein SSL-Zertifikat kaufen und auf Ihrem Server einrichten. In einem Worst-Case-Szenario, Sie könnten auch ein selbstsigniertes Zertifikat ausstellen, mit dem Sie kostenlose Verschlüsselung erhalten können, aber ich würde es tun nicht empfehlen, dies zu tun. Einige Zertifizierungsstellen stellen kostengünstige Zertifikate aus, und die Vorteile, die Sie aus der Arbeit mit einem vertrauenswürdigen, signierten Zertifikat ziehen, sind mit den zusätzlichen Kosten verbunden (z. B. Man-in-the-Middle-Angriffe durch Verwendung der PKI verhindern). Die Verwendung von selbstsignierten Zertifikaten könnte auch zusätzliche Codierungen oder sogar anwendungsspezifische „Hacks“ erfordern, da einige Netzwerkbibliotheken nicht vertrauenswürdige HTTPS-Verbindungen ablehnen (siehe Artikel zu Android, Nr. 1 und Nr. 2 und zu iOS)..
Das Aktivieren von SSL auf der Clientseite ist kein Kinderspiel: Übliche Programmiersprachen verfügen normalerweise über HTTP-Klassen und -Bibliotheken, die native HTTP-SSL-Unterstützung bieten. Die Verschlüsselung erfolgt automatisch durch die Verwendung von "https: //" - URLs anstelle von "http" : // "URLs, die Webdienste in Anspruch nehmen.
Wenn Sie sich für ein günstiges SSL-Zertifikat entscheiden, stellen Sie sicher, dass für die Geräte und Betriebssysteme, für die Sie ein Zertifikat entwickeln möchten, das Stammzertifikat der ausstellenden Zertifizierungsstelle standardmäßig installiert ist. Andernfalls vertrauen sie dem Zertifikat nicht.
Sie sollten die Benutzer niemals auffordern, ihre Systeme zu patchen, zu ändern oder zu hacken, um Ihre Apps auszuführen, und wenn Sie dies tun, erwarten Sie nicht, dass viele von ihnen die Anforderungen erfüllen.Web Services-Transaktionen sollen sein atomar, interoperabel und skalierbar, Web Services sind also in der Regel staatenlos (Sehen Sie sich diese interessante Diskussion über die Bedeutung von "staatenlosen" Verbindungen an).
Viele Webdienste bieten benutzerbezogene Funktionen und Zugriff auf vertrauliche Informationen. Dies erfordert natürlich eine Authentifizierung. Da solche Transaktionen zustandslos sind, mussten Sie Anforderungen normalerweise mit einem benutzerspezifischen Schlüssel signieren, um die Authentifizierung bei jedem Remote-Methodenaufruf zu ermöglichen. Selbst wenn Daten über HTTPS übertragen werden, sind die Anmeldeinformationen der Benutzer am größten, wenn sie über ein öffentliches Netzwerk übertragen werden. Die Verschlüsselung ist manchmal fehlerhaft.
In diesem Dilemma ist eine tokenbasierte Authentifizierung wie OAuth von Nutzen. Bei der tokenbasierten Authentifizierung müssen Sie die Anmeldeinformationen eines Benutzers nur einmal senden. Wenn der Benutzer erfolgreich authentifiziert wurde, werden ihm Token zur Verfügung gestellt, die zur Authentifizierung nachfolgender Remote-Methodenaufrufe verwendet werden können.
Die Gültigkeit eines Tokens erstreckt sich über eine begrenzte Lebensdauer und kann jederzeit vom Aussteller (d. H. Serverseitig) widerrufen werden. Mit der tokenbasierten Authentifizierung können Sie dieselben Benutzeranmeldeinformationen auch für verschiedene Apps und Dienste freigeben, ohne dass die verknüpften Dienste / Apps die tatsächlichen Benutzeranmeldeinformationen kennen. Außerdem bewahrt dieses Authentifizierungsverfahren sicher einen lokalen Cache der Anmeldeinformationen auf dem Gerät des Benutzers auf, so dass sich der Benutzer "erinnert" werden kann und nicht jedes Mal, wenn er die App verwendet, sich zu authentifizieren braucht (das Eingeben komplexer Kennwörter auf Handhelds kann eine echte sein Schmerzen und können App-Bewertungen stark beschädigen).
OAuth ist das am häufigsten auf Token basierende Authentifizierungs-Framework und wurde von großen Playern wie Google, Twitter, Facebook usw. übernommen. Indem Sie Benutzern die Möglichkeit geben, vorhandene Konten wiederzuverwenden, lästige Registrierungsformulare zu überspringen und die Kontrolle über den Zugriff auf Ihre persönlichen Daten zu behalten, können Sie Ihre Benutzerbasis erheblich steigern.
Einige OAuth-Anbieter verlangen, dass ein eigenes SDK in Ihre Apps importiert wird, um die Authentifizierung zu aktivieren. Andernfalls gibt es eine Reihe von vorgefertigten OAuth-Bibliotheken, die Sie in Ihre App integrieren können. Es gibt auch Frameworks wie oauth-php, um benutzerdefinierte OAuth-Provider zu erstellen.
Ich würde signpost als Android OAuth-Clientbibliothek und oauthconsumer für iOS vorschlagen.
Alle diese Bibliotheken enthalten nützliche Beispiele und sind leicht zu implementieren. Das Erstellen der Wegweiserquellen auf Ihrem Computer oder das Importieren in eine App kann jedoch etwas schmerzhaft sein, aber Sie müssen diesen Prozess nicht wirklich durchlaufen. Stattdessen können Sie einfach die JAR-Binaries in Ihr Projekt importieren, und Sie sollten festgelegt werden. Unter iOS ähnelt dies dem Import einer statischen Bibliothek (* .a-Datei) in Ihr Projekt.
Die gebräuchlichste Authentifizierungsmethode für SOAP-basierte Dienste ist eine SOAP-Erweiterung mit der Bezeichnung HTTP Basic Authentication (manchmal auch als Digest-Authentifizierung bezeichnet). Dies ist ein standardisiertes, gut unterstütztes Verfahren, das in alle gängigen Webserver wie Apache, Nginx und IIS integriert ist. Es basiert auf einem Benutzernamen-Passwort-Paar, das über HTTP-Header an den Server gesendet werden muss.
Normalerweise müssen Sie die Basisauthentifizierung in Ihren Anwendungen nicht manuell implementieren, da sie auch in den gängigen Programmiersprachen weitgehend unterstützt wird. Das .NET-Framework stützt sich auf die NetworkCredential-Klasse, um HTTP-Anforderungen mit grundlegenden und Digest-Berechtigungsnachweisen zu versehen. PHP unterstützt dies über cURL und Java über Authenticator.
Wenn Sie Basic Auth selbst implementieren müssen, müssen Sie diesen Header lediglich zu Ihren Anforderungen hinzufügen:
Grundbenutzername: Passwort
Die Werte für "Benutzername" und "Passwort" müssen sein base64-codiert.
Bitte beachte das HTTP Basic Auth wird am besten in Kombination mit dem HTTPS-Protokoll verwendet, wie es Anmeldeinformationen in überträgt Klartext bilden. Digest Auth ist ein wenig sicherer, da es tatsächlich den Passwortwert hashes, aber HTTPS wird trotzdem empfohlen, um Bruteforce-Angriffe zu vermeiden.
Weitere Einzelheiten und Spezifikationen zu diesem Thema finden Sie in der Notiz IETF RFC 2617.
Bei der Auswahl einer Authentifizierungsmethode oder bei der Integration bekannter Dienste (wie z. B. soziale Netzwerke) sollten Sie auch die systemeigenen Bibliotheken berücksichtigen, die in vielen fortschrittlichen Plattformen wie iOS und Android integriert sind. Dadurch können Sie viel Zeit und Codezeilen einsparen.
Android bietet ein schönes Framework zur Zentralisierung der Benutzerkontenverwaltung, der AccountManager-Klasse. Das offizielle Android-Entwicklerhandbuch enthält einige nützliche Dokumentationen für diese Klasse sowie Tipps zur Integration von OAuth 2 oder zum Erstellen eines eigenen benutzerdefinierten Kontotyps..
Mit iOS 6 hat Apple ein neues Social Framework eingeführt, um wichtige Dienste wie Twitter, Facebook und Sina Weibo auf Betriebssystemebene zu integrieren. Selbst wenn Sie diese Dienste nicht in Ihre Anwendung integrieren müssen, finden Sie möglicherweise eine geeignete Methode, um die integrierten Authentifizierungsmethoden über die Anpassung zu nutzen.
Bei der Entwicklung für mobile Anwendungen ist es wichtig, Ihre Datennutzlasten so gering wie möglich zu halten. In diesem Abschnitt werden verschiedene Strategien erläutert.
ZIP-Komprimierung Text und binäre Daten können erheblich reduziert werden und wird auf den meisten Plattformen gut unterstützt. Nutzen Sie ihn daher gut, wenn Sie große Daten über mobile Netzwerke übertragen möchten. Nützliche Bibliotheken zum Verwalten von ZIP-Dateien sind für Android (d. H. Dekomprimieren) und iOS (d. H. Ziparchive) verfügbar..
Wenn Sie Audio- / Video-Inhalte auf Ihre mobilen Apps streamen müssen, wählen Sie erweiterte Streaming-Plattformen, mit denen Streams je nach Netzwerk- / Geräteleistung skaliert werden können, z. B. das HTTP-Live-Streaming-Protokoll (HLS) von Apple. Ansonsten ist es normalerweise eine gute Wahl, die Reaktionsfähigkeit gegenüber der Medienqualität zu bevorzugen. Spielen Sie mit verschiedenen Video- und Audiokompressoren und -einstellungen und optimieren Sie so viel wie möglich. Sie können auch Geräte nach Arten gruppieren (Handhelds mit kleinem Bildschirm, Handhelds mit Breitbildschirm und Tablets) und für jeden Typ unterschiedliche Inhalte bereitstellen.
Viele mobile Geräte verfügen über HD-Displays, aber ist HD-Inhalt auf kleinen Bildschirmen wirklich eine zusätzliche Bandbreite wert? Seien Sie ehrlich über die Relevanz der Medienqualität in Ihren Apps und versuchen Sie, die beste Balance zwischen Qualität und Gewicht zu finden.
Angenommen, Sie müssen eine Leser-App für eine Online-Zeitung programmieren. Zunächst sollten Sie Ihren Benutzern immer erlauben, offline zu arbeiten, wann immer dies möglich ist. Während einige Apps immer ein aktives Netzwerk benötigen (z. B. Messaging-Dienste), sollten viele andere das Netzwerk nur dazu verwenden Laden Sie Datenpakete herunter und speichern Sie sie auf dem Gerät.
Dies verbessert die Anwendungsleistung, spart dem Benutzer Geld für nicht flache mobile Datentarife und macht die App nutzbar, wenn das Netzwerk nicht verfügbar ist (z. B. während des Fluges)..
Beim Herunterladen von Inhalten auf Geräten, auf denen ein externer Speicher (z. B. Speicherkarten) installiert ist, sollten Sie den Benutzern die Wahl überlassen, wo heruntergeladene Inhalte (d. H. Interner oder externer Speicher) gespeichert werden sollen, oder den externen Speicher trotzdem bevorzugen. Einsteigergeräte verfügen normalerweise über einen relativ kleinen internen Speicher und können instabil oder langsam werden, wenn der interne Speicher voll ist. Wenn Ihre Apps viel Speicherplatz in Anspruch nehmen, werden sie wahrscheinlich deinstalliert, um Speicherplatz zu sparen.
Gehen wir zurück zum Beispiel der Reader App. Jeder Artikel ist ein Einzelstück, und obwohl Artikel miteinander verknüpft werden könnten, gibt es keinen Grund, warum Sie nicht zulassen sollten, dass Benutzer Artikel lesen, selbst wenn zusätzlicher Inhalt noch heruntergeladen wird. Packen Sie also die Dateien jedes Artikels (Text, Bilder, Anhänge und Medien) ein separate ZIP-Archive und stellen Sie eine Webdienstmethode für die App zum Abrufen der bereit Liste der verfügbaren Artikel. Lassen Sie Ihre App ZIP-Pakete herunterladen Einer nach dem anderen und dann in der App verfügbar machen sobald jeder heruntergeladen wurde und während andere im Hintergrund heruntergeladen werden. Dies ist eine großartige Verbesserung der Leistung und Benutzerfreundlichkeit, verglichen mit dem Warten, bis die gesamte Nutzlast heruntergeladen wurde! Sie können auch zulassen, dass Benutzer auswählen, welche Pakete sie herunterladen möchten oder nicht (wodurch Platz, Zeit und Verkehr gespart werden können). Außerdem können Sie einzelne Pakete entfernen, um Speicherplatz zu sparen, ohne die gesamte App zu entfernen.
Im Folgenden finden Sie eine Antwort der Demo-Server-App, die in diesem Artikel enthalten ist:
apiversion: 1, Status: 0, Pakete: [Datei: "pack01_01_01.zip", Paket: "Pack01", Anwendungsversion: 1, Revision: 1, Datei: "Pack01_02_01.zip", Paket: "Pack01" , appversion: 2, Revision: 1, Datei: "pack02_01_01.zip", Paket: "Pack02", Appversion: 1, Revision: 1]
Beachten Sie, dass sich Ihre App und zuvor veröffentlichte Inhalte im Laufe der Zeit weiterentwickeln können.
Geben Sie für jedes Paket in der Listenmethode ein Revisionsflag an. Dies ist praktisch, um Updates zu veröffentlichen, Fehler im Inhalt zu beheben und die automatische Aktualisierungsfunktion in Ihren Apps zu implementieren. Auch wenn Sie derzeit keine Implementierung von Auto-Updates planen, denken Sie nach vorne und setzen Sie das Revisionsflag trotzdem in Ihre Liste, um zukünftige Entwicklungen zu ermöglichen.
Sie sollten auch ein "App-Version" -Flag in Ihre Paketliste aufnehmen. Wenn Sie eine neue Hauptversion Ihrer App herausgeben, die bahnbrechende Änderungen im Inhaltsformat enthält, können Sie Inhalte für neuere und ältere Apps über denselben Webdienst bereitstellen.
Bei der Entwicklung servicebasierter Apps, Netzwerke und Geräte Fehlertoleranz sollte auch berücksichtigt werden. Mobile Datenverbindungen sind in der Regel weniger stabil als verkabelte, Apps können deinstalliert und erneut installiert werden, Geräte können verloren gehen, durch neuere ersetzt oder vom Hersteller wiederhergestellt werden. Benutzer sollten die Möglichkeit erhalten, Apps und Inhalte auf einfache Weise wiederherzustellen, und Plattformentwickler bieten mehrere nützliche vorgefertigte Lösungen für diese Probleme an.
Erinnere dich an Überprüfen Sie immer den Netzwerkstatus Bevor Sie Remote-Services anrufen, oder behandeln Sie Netzwerk-E / A-Fehler sorgfältig und informieren Sie Ihre Benutzer ordnungsgemäß, wenn die gewünschte Aufgabe aufgrund einer fehlenden aktiven Datenverbindung nicht ausgeführt werden kann. Wenn Ihre Apps immer online arbeiten müssen, möchten Sie möglicherweise einen Watchdog in Ihre Apps aufnehmen, der den Netzwerkstatus ständig überwacht und bei jeder Änderung ein Ereignis auslöst. Möglicherweise möchten Sie die Benutzer auch über mögliche Mehrkosten informieren, wenn Sie große Datenmengen über 3G oder Roaming-Netzwerke anstelle von WLAN übertragen.
Auf Android-Geräten kann diese Aufgabe über ConnectivityManager und über SCNetworkReachability unter iOS ausgeführt werden (überprüfen Sie auch die bereitgestellte Beispiel-App)..
Sowohl Android als auch iOS bieten nützliche APIs für die Remote-Cloud-Sicherung von Benutzer-App-Daten, die Sie berücksichtigen sollten. Überprüfen Sie die iCloud-API-Dokumentation für iOS und die Dokumentation zum Android-Sicherungsdienst für Android. Zusammen mit den integrierten Sicherungsdiensten erhalten Sie außerdem gute Datensicherheitsfunktionen. Sie müssen jedoch darauf achten, Sicherungsdienste nicht mit redundanten oder unnötigen Sicherungen zu überladen.
Sie können auch eine benutzerdefinierte Remote-Datensicherung in Ihren Web-Services implementieren. Ich empfehle Ihnen jedoch dringend, sich an Standards und integrierte Plattform-APIs zu halten. Sie sparen normalerweise Zeit und werden von Plattform-Software-Ingenieuren aktiv gewartet. Betriebssystem-Patches werden bei Veröffentlichung wahrscheinlich auch schneller installiert.
Wenn Sie bezahlten Inhalt über In-App-Abrechnung in Ihrer App bereitstellen, können Benutzer dies zulassen wieder einkaufen Nach der Neuinstallation der App und Wiederherstellung der Geräte erfolgt verpflichtend. Glücklicherweise verfügen iOS und Android über integrierte APIs, um auch mit diesen Szenarien umgehen zu können.
Wenn Ihre In-App-Kauf-fähigen Apps zum ersten Mal (oder das erste Mal nach einer Neuinstallation) ausgeführt werden, sollten Sie eine Kauf- und Wiederherstellungsprüfung durchführen. Sowohl iOS als auch Android bieten eine schöne offizielle Dokumentation zu diesem Thema.
Denken Sie bei der Entwicklung für Android daran, dass nur "verwaltete" Elemente zu einem späteren Zeitpunkt wiederhergestellt werden können und diese nur für einen einmaligen Kauf verfügbar sind. Dies beinhaltet einige Überlegungen, die auch für die iOS-Entwicklung gelten.
Nehmen wir an, Sie entwickeln ein Rollenspiel und möchten, dass Spieler Artikel wie Heiltränke durch In-App-Abrechnung kaufen. Da Benutzer so viele Tränke kaufen können, wie sie möchten, können sie nicht "verwaltet" werden, sodass ihre Kaufvorgänge nicht dauerhaft gespeichert werden. Wenn ein Benutzer 20 Tränke kauft und 10 verwendet, wird das Spiel zu einem späteren Zeitpunkt deinstalliert und erneut installiert. Die Wiederherstellung von Einkäufen durch ein einfaches Standardverfahren würde 20 Tränke in das Inventar des Benutzers zurücklegen, von denen 10 ein unbeabsichtigtes Geschenk darstellen die Entwickler.
Daher müssen Sie möglicherweise Ihre eigenen benutzerdefinierten Webdienste und App-Methoden implementieren, um das Speichern und Wiederherstellen von Transaktionen in komplexen Szenarien oder Edge-Fällen durchzuführen.
Durch Fristen und Budgets werden Sie häufig abgeschnitten und Sie können nicht alle in diesem Artikel beschriebenen Best Practices befolgen. Aber auch wenn Sie gezwungen sind, sich an eine kleinere Teilmenge von Funktionen zu halten, denke nach vorne, einige zeit in gutem design verbringen, und packen Sie Ihre Methoden und Klassen in Bibliotheken dass Sie später wiederverwenden und erweitern können. Verlassen Sie Stubs, wenn Sie das Gefühl haben, dass noch Raum für die weitere Entwicklung besteht. Versuchen Sie auch zu erzwingen Rückwärtskompatibilität Wenn Sie Ihre Bibliotheken erweitern und verbessern, können auch ältere Anwendungen gepatcht werden.
Dies ist ein Beispiel für einen Stub:
public void sendData (Objektdaten) if (validate (data)) client.send (data); // Stub public boolean validate (Objektdaten) // TODO - Datenvalidierung implementieren return true;
Wenn Sie ein unerfahrener Entwickler sind oder noch nie dienstbasierte Anwendungen entwickelt haben, sollten Sie mit der bereitgestellten Beispielanwendung eine gute Übung sein, um Ihr Wissen zu verbessern und es in eine reale Anwendung umzuwandeln, die alle in diesem Artikel erläuterten Konzepte eins verwendet Zeit. Starten Sie alternativ eine neue Anwendung von Grund auf und integrieren Sie sie in einen bestehenden Dienstanbieter (Facebook, Twitter, Last.fm oder Dropbox ist ein guter Ausgangspunkt), und zwar nach demselben Zeitplan.
Wenn Sie bereits Service- und Netzwerkanwendungen entwickelt haben, können Sie Ihren vorhandenen Code überprüfen und gemäß den oben erläuterten Grundsätzen verbessern. So können Sie jede Verbesserung sowie den Einfluss auf die Leistung und Reaktionsfähigkeit nachverfolgen.
Vergessen Sie nicht, auch die verknüpften Ressourcen zu überprüfen, da Sie dadurch tiefer in den Kern der jeweiligen Ausgabe eingehen und die im Artikel enthaltenen Beispielserver- und Clientanwendungen herunterladen können.