Připojení k místním webovým službám z emulátorů Androidu a simulátorů iOS

Browse sample. Procházení ukázky

Mnoho mobilních a desktopových aplikací využívá webové služby. Během fáze vývoje softwaru je běžné nasadit webovou službu místně a využívat ji z aplikace spuštěné v emulátoru Androidu nebo simulátoru iOS. Tím se zabrání nasazení webové služby do hostovaného koncového bodu a umožňuje jednoduché ladění, protože aplikace i webová služba běží místně.

Aplikace .NET Multi-Platform App UI (.NET MAUI), které běží ve Windows nebo MacCatalystu, můžou využívat webové služby ASP.NET Core spuštěné místně přes PROTOKOL HTTP nebo HTTPS bez jakékoli další práce za předpokladu, že jste důvěřovali vývojovému certifikátu. Pokud ale aplikace běží v emulátoru Androidu nebo simulátoru iOS, vyžaduje se další práce a proces se liší v závislosti na tom, jestli webová služba běží přes PROTOKOL HTTP nebo HTTPS.

Adresa místního počítače

Emulátor Androidu i simulátor iOS poskytují přístup k webovým službám běžícím přes PROTOKOL HTTP nebo HTTPS na místním počítači. Adresa místního počítače se ale pro každý z nich liší.

Android

Každá instance emulátoru Androidu je izolovaná od síťových rozhraní vývojového počítače a běží za virtuálním směrovačem. Emulované zařízení proto nevidí váš vývojový počítač ani jiné instance emulátoru v síti.

Virtuální směrovač pro každý emulátor ale spravuje speciální síťový prostor, který obsahuje předem přidělené adresy, přičemž 10.0.2.2 adresa je alias rozhraní zpětné smyčky hostitele (127.0.0.1 na vašem vývojovém počítači). Vzhledem k tomu, že místní webová služba, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru /api/todoitems/ URI, může aplikace spuštěná v emulátoru Androidu tuto operaci využívat odesláním požadavku GET do http://10.0.2.2:<port>/api/todoitems/ nebo https://10.0.2.2:<port>/api/todoitems/.

iOS

Simulátor iOSu používá síť hostitelského počítače. Aplikace spuštěné v simulátoru se proto můžou připojit k webovým službám běžícím na místním počítači prostřednictvím IP adresy počítačů nebo názvu localhost hostitele. Například vzhledem k tomu, že místní webová služba, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru /api/todoitems/ URI, může aplikace spuštěná v simulátoru iOS tuto operaci využívat odesláním požadavku GET do http://localhost:<port>/api/todoitems/ nebo https://localhost:<port>/api/todoitems/.

Poznámka:

Při spuštění aplikace .NET MAUI v simulátoru iOS z Windows se aplikace zobrazí ve vzdáleném simulátoru iOS pro Windows. Aplikace je ale spuštěná na spárovaných počítačích Mac. Proto neexistuje přístup místního hostitele k webové službě spuštěné ve Windows pro aplikaci pro iOS běžící na Macu.

Místní webové služby spuštěné přes HTTP

Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS může využívat webovou službu ASP.NET Core spuštěnou místně přes protokol HTTP. Toho lze dosáhnout tak, že nakonfigurujete projekt aplikace .NET MAUI a projekt webové služby ASP.NET Core tak, aby umožňoval přenosy HTTP s vymazáním textu.

V kódu, který definuje adresu URL místní webové služby v aplikaci .NET MAUI, ujistěte se, že adresa URL webové služby určuje schéma HTTP a správný název hostitele. Třídu DeviceInfo je možné použít ke zjištění platformy, na které je aplikace spuštěná. Správný název hostitele pak můžete nastavit takto:

public static string BaseAddress =
    DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";

Další informace o třídě najdete v tématu Informace o DeviceInfozařízení.

Pokud chcete aplikaci spustit na Androidu, musíte přidat požadovanou konfiguraci zabezpečení sítě a ke spuštění aplikace v iOSu se musíte odhlásit od Apple Transport Security (ATS). Další informace najdete v tématu Konfigurace zabezpečení sítě Android a konfigurace ATS pro iOS.

Musíte také zajistit, aby webová služba ASP.NET Core byla nakonfigurovaná tak, aby povolovala provoz HTTP. Toho lze dosáhnout přidáním profilu HTTP do profiles části spuštění Nastavení.json v projektu webové služby ASP.NET Core:

{
  ...
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "api/todoitems",
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    ...
  }
}

Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS pak může využívat webovou službu ASP.NET Core spuštěnou místně přes protokol HTTP za předpokladu http , že je webová služba spuštěná s profilem.

Konfigurace zabezpečení sítě Pro Android

Pokud chcete povolit místní přenosy s jasným textem v Androidu, musíte vytvořit konfigurační soubor zabezpečení sítě. Toho lze dosáhnout přidáním nového souboru XML s názvem network_security_config.xml do složky Platforms\Android\Resources\xml v projektu aplikace .NET MAUI. Soubor XML by měl zadat následující konfiguraci:

<?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>

Poznámka:

Ujistěte se, že je akce sestavení souboru network_security_config.xml nastavená na AndroidResource.

Potom nakonfigurujte vlastnost networkSecurityConfig na uzlu aplikace v souboru Platforms\Android\AndroidManifest.xml v projektu aplikace .NET MAUI:

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config" ...>
        ...
    </application>
</manifest>

Další informace o konfiguračních souborech zabezpečení sítě najdete v tématu Konfigurace zabezpečení sítě na developer.android.com.

Konfigurace ATS pro iOS

Pokud chcete povolit místní přenosy v iOSu, měli byste se v aplikaci .NET MAUI odhlásit ze služby Apple Transport Security (ATS). Toho lze dosáhnout přidáním následující konfigurace do souboru Platforms\iOS\Info.plist v projektu aplikace .NET MAUI:

<key>NSAppTransportSecurity</key>    
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

Další informace o ATS naleznete v tématu Prevence nezabezpečených síťových Připojení developer.apple.com.

Místní webové služby spuštěné přes HTTPS

Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS může využívat webovou službu ASP.NET Core, která běží místně přes PROTOKOL HTTPS. Postup povolení je následující:

  1. Důvěřovat vývojovému certifikátu podepsanému svým držitelem na vašem počítači. Další informace najdete v tématu Důvěryhodnost vývojového certifikátu.
  2. Zadejte adresu místního počítače. Další informace naleznete v tématu Zadání adresy místního počítače.
  3. Obejít kontrolu zabezpečení místního vývojového certifikátu. Další informace najdete v tématu Obejití kontroly zabezpečení certifikátu.

Jednotlivé položky budou probrány naopak.

Důvěřovat vývojovému certifikátu

Instalace sady .NET Core SDK nainstaluje vývojový certifikát ASP.NET Core HTTPS do místního úložiště certifikátů uživatele. I když je však certifikát nainstalovaný, není důvěryhodný. Pokud chcete certifikátu důvěřovat, spusťte pomocí následujícího jednorázového kroku nástroj dotnet dev-certs :

dotnet dev-certs https --trust

Následující příkaz poskytuje nápovědu k nástroji dev-certs :

dotnet dev-certs https --help

Případně když spustíte projekt ASP.NET Core 2.1 (nebo novější), který používá HTTPS, Visual Studio zjistí, jestli chybí vývojový certifikát, a nabídne instalaci a důvěřování.

Poznámka:

Vývojový certifikát ASP.NET Core HTTPS je podepsaný svým držitelem.

Další informace o povolení místního https na počítači najdete v tématu Povolení místního HTTPS.

Zadejte adresu místního počítače.

V kódu, který definuje adresu URL místní webové služby v aplikaci .NET MAUI, ujistěte se, že adresa URL webové služby určuje schéma HTTPS a správný název hostitele. Třídu DeviceInfo je možné použít ke zjištění platformy, na které je aplikace spuštěná. Správný název hostitele pak můžete nastavit takto:

public static string BaseAddress =
    DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";

Další informace o třídě najdete v tématu Informace o DeviceInfozařízení.

Obejití kontroly zabezpečení certifikátu

Pokus o vyvolání místní zabezpečené webové služby z aplikace .NET MAUI spuštěné v emulátoru Androidu způsobí java.security.cert.CertPathValidatorException vyvolání zprávy s oznámením, že se nenašlo ukotvení důvěryhodnosti pro cestu certifikace. Podobně pokus o vyvolání místní zabezpečené webové služby z aplikace .NET MAUI spuštěné v simulátoru iOS způsobí NSURLErrorDomain chybu se zprávou, že certifikát pro server je neplatný. K těmto chybám dochází, protože místní vývojový certifikát HTTPS je podepsaný svým držitelem a certifikáty podepsané svým držitelem nejsou důvěryhodné pro Android nebo iOS. Proto je nutné ignorovat chyby SSL, když aplikace využívá místní zabezpečenou webovou službu.

Toho lze dosáhnout předáním nakonfigurovaných verzí nativních HttpMessageHandler tříd konstruktoru HttpClient , který dává třídě pokyn HttpClient , aby důvěřovala komunikaci localhost přes HTTPS. Třída HttpMessageHandler je abstraktní třída, jejíž implementace v Androidu AndroidMessageHandler je poskytována třídou, a jejíž implementace v iOSu je poskytována NSUrlSessionHandler třídou.

Následující příklad ukazuje třídu, která konfiguruje AndroidMessageHandler třídu v Androidu a třídě v iOSu NSUrlSessionHandler tak, aby důvěřovala komunikaci místního hostitele přes HTTPS:

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
}

V Androidu GetPlatformMessageHandler vrátí AndroidMessageHandler metoda objekt. Metoda GetPlatformMessageHandler nastaví vlastnost objektu ServerCertificateCustomValidationCallbackAndroidMessageHandler na zpětné volání, která ignoruje výsledek kontroly zabezpečení certifikátu pro místní vývojový certifikát HTTPS.

V iOSu GetPlatformMessageHandler vrátí NSUrlSessionHandler metoda objekt, který nastaví jeho TrustOverrideForUrl vlastnost na delegáta s názvem IsHttpsLocalHost , který odpovídá podpisu delegáta NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback . Delegát IsHttpsLocalHost se vrátí true , když adresa URL začíná https://localhostna .

Výsledný HttpClientHandler objekt je pak možné předat konstruktoru HttpClient jako argument pro sestavení ladění:

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

Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS pak může využívat webovou službu ASP.NET Core spuštěnou místně přes PROTOKOL HTTPS.