Freigeben über


Herstellen einer Verbindung zu lokalen Webdiensten über Android-Emulatoren und iOS-Simulatoren

Browse sample.Durchsuchen Sie das Beispiel

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 Netzwerksicherheitskonfiguration hinzufügen und Ihre App unter iOS ausführen, müssen Sie Apple Transport Security (ATS) deaktivieren. Weitere Informationen finden Sie unter Android-Netzwerksicherheitskonfiguration 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.

Konfiguration der Netzwerksicherheit unter Android

Um den lokalen Clear-Text-Datenverkehr unter Android zu aktivieren, müssen Sie eine Konfigurationsdatei für die Netzwerksicherheit erstellen. 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:

  1. Vertrauen Sie dem selbstsignierten Entwicklungszertifikat auf Ihrem Computer. Weitere Informationen finden Sie unter Vertrauen Sie Ihrem Entwicklungszertifikat.
  2. Geben Sie die Adresse Ihres lokalen Computers an. Weitere Informationen finden Sie unter Angeben der Adresse des lokalen Computers.
  3. 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 erreicht werden, indem konfigurierte Versionen der systemeigenen HttpMessageHandler Klassen an den HttpClient Konstruktor übergeben werden, wodurch die HttpClient Klasse angewiesen wird, die localhost-Kommunikation über HTTPS zu vertrauen. Die HttpMessageHandler Klasse ist eine abstrakte Klasse, deren Implementierung auf Android von der AndroidMessageHandler Klasse bereitgestellt wird und deren Implementierung unter iOS von der NSUrlSessionHandler Klasse bereitgestellt wird.

Das folgende Beispiel zeigt eine Klasse, die die AndroidMessageHandler Klasse unter Android und die NSUrlSessionHandler Klasse unter iOS konfiguriert, um der localhost-Kommunikation über HTTPS zu vertrauen:

public class HttpsClientHandlerService
{
    public HttpMessageHandler GetPlatformMessageHandler()
    {
#if ANDROID
        var handler = new Xamarin.Android.Net.AndroidMessageHandler();
        handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
        {
            if (cert != null && cert.Issuer.Equals("CN=localhost"))
                return true;
            return errors == System.Net.Security.SslPolicyErrors.None;
        };
        return handler;
#elif IOS
        var handler = new NSUrlSessionHandler
        {
            TrustOverrideForUrl = IsHttpsLocalhost
        };
        return handler;
#else
     throw new PlatformNotSupportedException("Only Android and iOS supported.");
#endif
    }

#if IOS
    public bool IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust trust)
    {
        return url.StartsWith("https://localhost");
    }
#endif
}

Unter Android gibt die GetPlatformMessageHandler Methode ein AndroidMessageHandler Objekt zurück. Die GetPlatformMessageHandler Methode legt die ServerCertificateCustomValidationCallback Eigenschaft für das AndroidMessageHandler Objekt auf einen Rückruf fest, der das Ergebnis der Zertifikatsicherheitsprüfung für das lokale HTTPS-Entwicklungszertifikat ignoriert.

Unter iOS gibt die GetPlatformMessageHandler Methode ein NSUrlSessionHandler Objekt zurück, das seine TrustOverrideForUrl Eigenschaft auf einen Delegaten IsHttpsLocalHost festlegt, der mit der Signatur des NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback Delegaten übereinstimmt. Der Delegat IsHttpsLocalHost gibt zurück true, wenn die URL mit https://localhost.

Das resultierende HttpClientHandler Objekt kann dann als Argument an den HttpClient Konstruktor für Debugbuilds übergeben werden:

#if DEBUG
            HttpsClientHandlerService handler = new HttpsClientHandlerService();
            HttpClient client = new HttpClient(handler.GetPlatformMessageHandler());
#else
            client = new HttpClient();
#endif

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.