Herstellen einer Verbindung zu lokalen Webdiensten über Android-Emulatoren und iOS-Simulatoren
Viele Mobile- und Desktop-Apps nutzen Webdienste. Während der Softwareentwicklungsphase ist es üblich, einen Webdienst lokal bereitzustellen und von einer App zu nutzen, die im Android-Emulator oder iOS-Simulator ausgeführt wird. Dies verhindert, dass der Webdienst auf einem gehosteten Endpunkt bereitgestellt werden muss, und ermöglicht eine einfache Debugumgebung, da sowohl die App als auch der Webdienst lokal ausgeführt werden.
.NET Multi-Platform App UI (.NET MAUI)-Apps, die unter Windows oder MacCatalyst ausgeführt werden, können ASP.NET Core-Webdienste nutzen, die lokal über HTTP oder HTTPS ausgeführt werden, vorausgesetzt, Sie haben Ihr Entwicklungszertifikat als vertrauenswürdig eingestuft. Zusätzliche Arbeit ist jedoch erforderlich, wenn die App im Android-Emulator oder iOS-Simulator ausgeführt wird, und der Prozess unterscheidet sich je nachdem, ob der Webdienst über HTTP oder HTTPS ausgeführt wird.
Adresse des lokalen Computers
Der Android-Emulator und der iOS-Simulator bieten beide Zugriff auf Webdienste, die über HTTP oder HTTPS auf Ihrem lokalen Computer ausgeführt werden. Die Adresse des lokalen Computers ist jedoch für jeden anders.
Android
Jede Instanz des Android-Emulators ist von den Netzwerkschnittstellen Ihres Entwicklungscomputers isoliert und wird hinter einem virtuellen Router ausgeführt. Aus diesem Grund kann ein emuliertes Gerät Ihren Entwicklungscomputer oder andere Emulatorinstanzen im Netzwerk nicht sehen.
Der virtuelle Router für jeden Emulator verwaltet jedoch einen speziellen Netzwerkadressraum, der vorab zugeordnete Adressen enthält,wobei die 10.0.2.2
-Adressen ein Alias für Ihre Host-Loopback-Schnittstelle sind („127.0.0.1“ auf Ihrem Entwicklungscomputer). Daher kann eine Anwendung, die im Android-Emulator ausgeführt wird, vorausgesetzt, dass ein lokaler Webdienst einen GET-Vorgang über den relativen URI /api/todoitems/
verfügbar macht, den Vorgang nutzen, indem sie eine GET-Anforderung an http://10.0.2.2:<port>/api/todoitems/
oder https://10.0.2.2:<port>/api/todoitems/
sendet.
iOS
Der iOS-Simulator verwendet das Netzwerk des Hostcomputers. Daher können Aomputers oder über den localhost
Hostnamen eine Verbindung mit Webdiensten herstellen, die auf Ihrem lokalen Computer ausgeführt werden. Beispielsweise kann eine Anwendung, die im iOS-Emulator ausgeführt wird, vorausgesetzt, dass ein lokaler Webdienst einen GET-Vorgang über den relativen URI /api/todoitems/
verfügbar macht, den Vorgang nutzen, indem sie eine GET-Anforderung an http://localhost:<port>/api/todoitems/
oder https://localhost:<port>/api/todoitems/
sendet.
Hinweis
Wenn Sie eine .NET MAUI-App im iOS-Simulator von Windows ausführen, wird die App im Remote-iOS-Simulator für Windows angezeigt. Die App wird jedoch auf dem gekoppelten Mac ausgeführt. Daher gibt es keinen localhost-Zugriff auf einen Webdienst, der in Windows für eine auf einem Mac ausgeführte iOS-App ausgeführt wird.
Lokale Webdienste, die über HTTP ausgeführt werden
Eine .NET MAUI-App, die im Android-Emulator oder iOS-Simulator ausgeführt wird, kann einen ASP.NET Core-Webdienst nutzen, der lokal über HTTP ausgeführt wird. Dies kann erreicht werden, indem Sie Ihr .NET MAUI-App-Projekt und Ihr ASP.NET Core-Webdienstprojekt konfigurieren, um Klartext-HTTP-Datenverkehr zu ermöglichen.
Stellen Sie im Code, der die URL Ihres lokalen Webdiensts in Ihrer .NET MAUI-App definiert, sicher, dass die Webdienst-URL das HTTP-Schema und den richtigen Hostnamen angibt. Die DeviceInfo Klasse kann verwendet werden, um die Plattform zu erkennen, auf der die App ausgeführt wird. Der richtige Hostname kann dann wie folgt festgelegt werden:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Weitere Informationen zur DeviceInfo Klasse finden Sie unter Geräteinformationen.
Um Ihre App unter Android auszuführen, müssen Sie außerdem die erforderliche Netzwerkkonfiguration hinzufügen, und um die App unter iOS ausführen, müssen Sie Apple Transport Security (ATS) deaktivieren. Weitere Informationen finden Sie unter Android-Netzwerkkonfiguration und iOS ATS-Konfiguration.
Sie müssen auch sicherstellen, dass Ihr ASP.NET Core-Webdienst so konfiguriert ist, dass HTTP-Datenverkehr zulässig ist. Dies kann durch Hinzufügen eines HTTP-Profils zum profiles
Abschnitt launchSettings.json in Ihrem ASP.NET Core-Webdienstprojekt erreicht werden:
{
...
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "api/todoitems",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
...
}
}
Eine .NET MAUI-App, die im Android-Emulator oder iOS-Simulator ausgeführt wird, kann dann einen ASP.NET Core-Webdienst nutzen, der lokal über HTTP ausgeführt wird, vorausgesetzt, dass der Webdienst mit dem http
Profil gestartet wird.
Android-Netzwerkkonfiguration
Es gibt zwei Hauptansätze für die Aktivierung von lokalem Klartextdatenverkehr unter Android:
- Aktivieren Sie den Klartext-Netzwerkdatenverkehr für die Kommunikation mit allen Domänen. Weitere Informationen finden Sie unter Aktivieren von Klartext-Netzwerkdatenverkehr für alle Domänen.
- Aktivieren Sie den Klartext-Netzwerkdatenverkehr für die Kommunikation mit der Domäne
localhost
. Weitere Informationen finden Sie unter Aktivieren von Klartext-Netzwerkdatenverkehr für die Domäne localhost.
Aktivieren von Klartext-Netzwerkdatenverkehr für alle Domänen
Der Klartext-Netzwerkdatenverkehr für alle Domänen kann aktiviert werden, indem die UsesCleartextTraffic
-Eigenschaft des Attributs Application
auf true
festgelegt wird. Dies sollte in der Datei Plattformen > Android > MainApplication.cs in Ihrem .NET MAUI-App-Projekt ausgeführt werden und in ein #if DEBUG
eingeschlossen werden, um sicherzustellen, dass die Aktivierung nicht versehentlich in einer Produktions-App stattfindet:
#if DEBUG
[Application(UsesCleartextTraffic = true)]
#else
[Application]
#endif
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
Hinweis
Die UsesCleartextTraffic
-Eigenschaft wird unter Android 7.0 (API 24) und höher ignoriert, wenn eine Netzwerksicherheits-Konfigurationsdatei vorhanden ist.
Aktivieren von Klartext-Netzwerkdatenverkehr für die Domäne localhost
Der Klartext-Netzwerkdatenverkehr für die Domäne localhost
kann durch Erstellen einer Netzwerksicherheits-Konfigurationsdatei aktiviert werden. Dies kann durch Hinzufügen einer neuen XML-Datei namens network_security_config.xml zum Ordner "Platforms\Android\Resources\xml" in Ihrem .NET MAUI-App-Projekt erreicht werden. Die XML-Datei sollte die folgende Konfiguration angeben:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">10.0.2.2</domain>
</domain-config>
</network-security-config>
Hinweis
Stellen Sie sicher, dass die Buildaktion der network_security_config.xml Datei auf AndroidResource festgelegt ist.
Konfigurieren Sie dann die networkSecurityConfig-Eigenschaft auf dem Anwendungsknoten in der Datei "Platforms\Android\AndroidManifest.xml " in Ihrem .NET MAUI-App-Projekt:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application android:networkSecurityConfig="@xml/network_security_config" ...>
...
</application>
</manifest>
Weitere Informationen zu Netzwerksicherheitskonfigurationsdateien finden Sie unter Netzwerksicherheitskonfiguration auf developer.android.com.
iOS ATS-Konfiguration
Um den lokalen Clear-Text-Datenverkehr unter iOS zu aktivieren, sollten Sie die Apple Transport Security (ATS) in Ihrer .NET MAUI-App deaktivieren. Dies kann durch Hinzufügen der folgenden Konfiguration zur Datei "Platforms\iOS\Info.plist " in Ihrem .NET MAUI-App-Projekt erreicht werden:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Weitere Informationen zu ATS finden Sie unter Unsichere Netzwerkverbindungen verhindern auf developer.apple.com.
Lokale Webdienste, die über HTTPS ausgeführt werden
Eine .NET MAUI-App, die im Android-Emulator oder iOS-Simulator ausgeführt wird, kann einen ASP.NET Core-Webdienst nutzen, der lokal über HTTPS ausgeführt wird. Der Prozess, um dies zu aktivieren, ist wie folgt:
- Vertrauen Sie dem selbstsignierten Entwicklungszertifikat auf Ihrem Computer. Weitere Informationen finden Sie unter Vertrauen Sie Ihrem Entwicklungszertifikat.
- Geben Sie die Adresse Ihres lokalen Computers an. Weitere Informationen finden Sie unter Angeben der Adresse des lokalen Computers.
- Umgehen Sie die Sicherheitsüberprüfung des lokalen Entwicklungszertifikats. Weitere Informationen finden Sie unter Umgehen der Zertifikatsicherheitsüberprüfung.
Jeder Aspekt wird nacheinander erläutert.
Vertrauen Sie Ihrem Entwicklungszertifikat
Beim Installieren des .NET Core SDK wird das ASP.NET Core HTTPS-Entwicklungszertifikat in Ihrem lokalen Benutzerzertifikatspeicher installiert. Allerdings ist das Zertifikat, auch wenn es installiert wurde, nicht vertrauenswürdig. Damit das Zertifikat vertrauenswürdig wird, führen Sie den folgenden, einmaligen Schritt durch, um das dotnet-Tool dev-certs
auszuführen:
dotnet dev-certs https --trust
Der folgende Befehl stellt Hilfe zum dev-certs
-Tool bereit:
dotnet dev-certs https --help
Alternativ erkennt Visual Studio, wenn Sie ein ASP.NET Core 2.1-Projekt (oder höher) ausführen, das HTTPS verwendet, ob das Entwicklungszertifikat fehlt, und bietet an, es zu installieren und ihm zu vertrauen.
Hinweis
Das ASP.NET Core-HTTPS-Entwicklungszertifikat ist selbstsigniert.
Weitere Informationen zum Aktivieren von lokalem HTTPS auf Ihrem Computer finden Sie unter Aktivieren von lokalem HTTPS.
Angeben der Adresse des lokalen Computers
Stellen Sie im Code, der die URL Ihres lokalen Webdiensts in Ihrer .NET MAUI-App definiert, sicher, dass die Webdienst-URL das HTTPS-Schema und den richtigen Hostnamen angibt. Die DeviceInfo Klasse kann verwendet werden, um die Plattform zu erkennen, auf der die App ausgeführt wird. Der richtige Hostname kann dann wie folgt festgelegt werden:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Weitere Informationen zur DeviceInfo Klasse finden Sie unter Geräteinformationen.
Umgehen der Zertifikatsicherheitsüberprüfung
Der Versuch, einen lokalen sicheren Webdienst aus einer .NET MAUI-App aufzurufen, die in einem Android-Emulator ausgeführt wird, führt zu einem java.security.cert.CertPathValidatorException
Auslösen, wobei eine Meldung angezeigt wird, dass der Vertrauensanker für den Zertifizierungspfad nicht gefunden wurde. Ebenso führt der Versuch, einen lokalen sicheren Webdienst aus einer .NET MAUI-App aufzurufen, die in einem iOS-Simulator ausgeführt wird, zu einem NSURLErrorDomain
Fehler mit einer Meldung, die angibt, dass das Zertifikat für den Server ungültig ist. Diese Fehler treten auf, da das lokale HTTPS-Entwicklungszertifikat selbstsigniert ist und selbstsignierte Zertifikate von Android oder iOS nicht als vertrauenswürdig eingestuft werden. Daher ist es erforderlich, SSL-Fehler zu ignorieren, wenn eine App einen lokalen sicheren Webdienst verwendet.
Dies kann durch die Konfiguration einer Instanz von HttpClientHandler mit einem benutzerdefinierten ServerCertificateCustomValidationCallback erreicht werden, der die HttpClient-Klasse anweist, der Kommunikation mit localhost über HTTPS zu vertrauen. Das folgende Beispiel zeigt, wie Sie eine Instanz von HttpClientHandler erstellen, die Fehler bei der Validierung von Localhost-Zertifikaten ignoriert:
var handler = new HttpClientHandler();
#if DEBUG
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
{
if (cert != null && cert.Issuer.Equals("CN=localhost"))
return true;
return errors == System.Net.Security.SslPolicyErrors.None;
};
#endif
var client = new HttpClient(handler);
Wichtig
Der obige Code ignoriert Fehler bei der Localhost-Zertifikatüberprüfung, jedoch nur in Debugbuilds. Dieser Ansatz vermeidet Sicherheitsvorfälle in Produktionsbuilds.
Eine .NET MAUI-App, die im Android-Emulator oder iOS-Simulator ausgeführt wird, kann einen ASP.NET Core-Webdienst nutzen, der lokal über HTTPS ausgeführt wird.