Android öykünücülerinden ve iOS simülatörlerinden yerel web hizmetlerine Bağlan
Birçok mobil ve masaüstü uygulaması web hizmetlerini kullanır. Yazılım geliştirme aşamasında, bir web hizmetini yerel olarak dağıtmak ve Android öykünücüsunda veya iOS simülatöründe çalışan bir uygulamadan kullanmak yaygın bir işlemdir. Bu, web hizmetini barındırılan bir uç noktaya dağıtmak zorunda kalmamasını sağlar ve hem uygulama hem de web hizmeti yerel olarak çalıştığından basit bir hata ayıklama deneyimi sağlar.
Windows veya MacCatalyst üzerinde çalışan .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) uygulamaları, geliştirme sertifikanıza güvenmiş olmanız koşuluyla HTTP veya HTTPS üzerinden yerel olarak çalışan ASP.NET Core web hizmetlerini ek bir çalışma yapmadan kullanabilir. Ancak, uygulama Android öykünücüsunda veya iOS simülatöründe çalışırken ek çalışma gerekir ve web hizmetinin HTTP veya HTTPS üzerinden çalışıp çalışmadığına bağlı olarak işlem farklıdır.
Yerel makine adresi
Android öykünücüsü ve iOS simülatörü, yerel makinenizde HTTP veya HTTPS üzerinden çalışan web hizmetlerine erişim sağlar. Ancak, her biri için yerel makine adresi farklıdır.
Android
Android öykünücüsünün her örneği geliştirme makinesi ağ arabirimlerinizden yalıtılır ve bir sanal yönlendiricinin arkasında çalışır. Bu nedenle, öykünülmüş bir cihaz geliştirme makinenizi veya ağdaki diğer öykünücü örneklerini göremez.
Ancak, her öykünücünün sanal yönlendiricisi önceden ayrılmış adresleri içeren özel bir ağ alanını yönetir ve adres ana 10.0.2.2
bilgisayar geri döngü arabiriminizin diğer adıdır (geliştirme makinenizde 127.0.0.1). Bu nedenle, göreli URI aracılığıyla /api/todoitems/
get işlemini kullanıma sunan yerel bir web hizmeti verüldüğünde, Android öykünücüsnde çalışan bir uygulama veya https://10.0.2.2:<port>/api/todoitems/
öğesine http://10.0.2.2:<port>/api/todoitems/
get isteği göndererek işlemi kullanabilir.
iOS
iOS simülatörü konak makine ağını kullanır. Bu nedenle, simülatörde çalışan uygulamalar, yerel makinenizde çalışan web hizmetlerine makinelerin IP adresi veya ana bilgisayar adı aracılığıyla localhost
bağlanabilir. Örneğin, göreli URI aracılığıyla /api/todoitems/
get işlemini kullanıma sunan yerel bir web hizmeti verüldüğünde, iOS simülatöründe çalışan bir uygulama veya https://localhost:<port>/api/todoitems/
öğesine http://localhost:<port>/api/todoitems/
bir GET isteği göndererek işlemi kullanabilir.
Not
Windows'tan iOS simülatöründe bir .NET MAUI uygulaması çalıştırırken, uygulama Windows için uzak iOS simülatöründe görüntülenir. Ancak, uygulama eşleştirilmiş Mac üzerinde çalışıyor. Bu nedenle, Mac üzerinde çalışan bir iOS uygulaması için Windows'ta çalışan bir web hizmetine localhost erişimi yoktur.
HTTP üzerinden çalışan yerel web hizmetleri
Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, HTTP üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir. Bu, .NET MAUI uygulama projenizi ve ASP.NET Core web hizmeti projenizi düz metin HTTP trafiğine izin verecek şekilde yapılandırarak elde edilebilir.
.NET MAUI uygulamanızda yerel web hizmetinizin URL'sini tanımlayan kodda, web hizmeti URL'sinin HTTP düzenini ve doğru ana bilgisayar adını belirttiğinden emin olun. sınıfı, DeviceInfo
uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Ardından doğru konak adı aşağıdaki gibi ayarlanabilir:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Sınıfı hakkında DeviceInfo
daha fazla bilgi için bkz . Cihaz bilgileri.
Ayrıca, uygulamanızı Android'de çalıştırmak için gerekli ağ güvenlik yapılandırmasını eklemeniz ve uygulamanızı iOS'ta çalıştırmak için Apple Aktarım Güvenliği'ni (ATS) geri çevirmeniz gerekir. Daha fazla bilgi için bkz . Android ağ güvenliği yapılandırması ve iOS ATS yapılandırması.
ayrıca ASP.NET Core web hizmetinizin HTTP trafiğine izin verecek şekilde yapılandırıldığından emin olmanız gerekir. Bu, ASP.NET Core web hizmeti projenizde launch Ayarlar.json bölümüne bir HTTP profili profiles
ekleyerek elde edilebilir:
{
...
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "api/todoitems",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
...
}
}
Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, web hizmetinin profille birlikte başlatılması koşuluyla http
HTTP üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir.
Android ağ güvenliği yapılandırması
Android'de düz metin yerel trafiğini etkinleştirmek için bir ağ güvenlik yapılandırma dosyası oluşturmanız gerekir. Bu, .NET MAUI uygulama projenizdeki Platforms\Android\Resources\xml klasörüne network_security_config.xml adlı yeni bir XML dosyası ekleyerek elde edilebilir. XML dosyası aşağıdaki yapılandırmayı belirtmelidir:
<?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>
Not
network_security_config.xml dosyasının derleme eyleminin AndroidResource olarak ayarlandığından emin olun.
Ardından, .NET MAUI uygulama projenizdeki Platforms\Android\AndroidManifest.xml dosyasındaki uygulama düğümünde networkSecurityConfig özelliğini yapılandırın:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application android:networkSecurityConfig="@xml/network_security_config" ...>
...
</application>
</manifest>
Ağ güvenliği yapılandırma dosyaları hakkında daha fazla bilgi için bkz . developer.android.com'de ağ güvenliği yapılandırması .
iOS ATS yapılandırması
iOS'ta düz metin yerel trafiğini etkinleştirmek için .NET MAUI uygulamanızda Apple Aktarım Güvenliği'ni (ATS) geri çevirmeniz gerekir. Bu, .NET MAUI uygulama projenizdeki Platforms\iOS\Info.plist dosyasına aşağıdaki yapılandırma eklenerek elde edilebilir:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
ATS hakkında daha fazla bilgi için bkz. developer.apple.com'da Güvenli Olmayan Ağ Bağlan yonlarını Önleme.
HTTPS üzerinden çalışan yerel web hizmetleri
Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, HTTPS üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir. Bunu etkinleştirme işlemi aşağıdaki gibidir:
- Makinenizde otomatik olarak imzalanan geliştirme sertifikasına güvenin. Daha fazla bilgi için bkz . Geliştirme sertifikanıza güvenme.
- Yerel makinenizin adresini belirtin. Daha fazla bilgi için bkz . Yerel makine adresini belirtme.
- Yerel geliştirme sertifikası güvenlik denetimini atla. Daha fazla bilgi için bkz . Sertifika güvenlik denetimini atlama.
Her öğe sırayla ele alınacaktır.
Geliştirme sertifikanıza güvenme
.NET Core SDK'sını yüklemek, ASP.NET Core HTTPS geliştirme sertifikasını yerel kullanıcı sertifika deponuza yükler. Ancak, sertifika yüklenirken güvenilir değildir. Sertifikaya güvenmek için dotnet dev-certs
aracını çalıştırmak için aşağıdaki tek seferlik adımı gerçekleştirin:
dotnet dev-certs https --trust
Aşağıdaki komut araçla ilgili dev-certs
yardım sağlar:
dotnet dev-certs https --help
Alternatif olarak, HTTPS kullanan bir ASP.NET Core 2.1 projesi (veya üzeri) çalıştırdığınızda, Visual Studio geliştirme sertifikasının eksik olup olmadığını algılar ve sertifikayı yükleyip güvenmeyi teklif eder.
Not
ASP.NET Core HTTPS geliştirme sertifikası otomatik olarak imzalanır.
Makinenizde yerel HTTPS'yi etkinleştirme hakkında daha fazla bilgi için bkz . Yerel HTTPS'yi etkinleştirme.
Yerel makine adresini belirtin
.NET MAUI uygulamanızdaki yerel web hizmetinizin URL'sini tanımlayan kodda, web hizmeti URL'sinin HTTPS düzenini ve doğru ana bilgisayar adını belirttiğinden emin olun. sınıfı, DeviceInfo
uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Ardından doğru konak adı aşağıdaki gibi ayarlanabilir:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Sınıfı hakkında DeviceInfo
daha fazla bilgi için bkz . Cihaz bilgileri.
Sertifika güvenlik denetimini atlama
Android öykünücüsunda çalışan bir .NET MAUI uygulamasından yerel güvenli bir web hizmeti çağırmaya çalışmak, sertifika yolu için güven bağlantı noktasının bulunamadığını belirten bir iletiyle birlikte bir java.security.cert.CertPathValidatorException
atılmaya neden olur. Benzer şekilde, iOS simülatöründe çalışan bir .NET MAUI uygulamasından yerel güvenli bir web hizmeti çağırmaya çalışmak, sunucu sertifikasının geçersiz olduğunu belirten bir iletiyle hataya neden NSURLErrorDomain
olur. Bu hatalar, yerel HTTPS geliştirme sertifikası otomatik olarak imzalandığından ve otomatik olarak imzalanan sertifikalara Android veya iOS tarafından güvenilmediğinden oluşur. Bu nedenle, bir uygulama yerel güvenli bir web hizmeti kullandığında SSL hatalarını yoksaymak gerekir.
Bu, yerel HttpMessageHandler
sınıfların yapılandırılmış sürümlerini oluşturucuya HttpClient
geçirerek gerçekleştirilebilir ve bu da sınıfın HTTPS üzerinden localhost iletişimine güvenmesini HttpClient
bildirir. sınıfı HttpMessageHandler
, Android'de uygulaması sınıfı tarafından AndroidMessageHandler
sağlanan ve iOS'ta uygulaması sınıfı tarafından NSUrlSessionHandler
sağlanan soyut bir sınıftır.
Aşağıdaki örnekte, Android'de sınıfını ve NSUrlSessionHandler
iOS'taki sınıfıNı HTTPS üzerinden localhost iletişimine güvenecek şekilde yapılandıran AndroidMessageHandler
bir sınıf gösterilmektedir:
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)
{
if (url.StartsWith("https://localhost"))
return true;
return false;
}
#endif
}
Android'de GetPlatformMessageHandler
yöntemi bir AndroidMessageHandler
nesne döndürür. GetPlatformMessageHandler
yöntemi, nesnedeki AndroidMessageHandler
özelliğini, yerel HTTPS geliştirme sertifikası için sertifika güvenlik denetiminin sonucunu yoksayan bir geri çağırmaya ayarlarServerCertificateCustomValidationCallback
.
iOS'ta GetPlatformMessageHandler
yöntemi, özelliğini temsilcinin imzası NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback
ile eşleşen adlı IsHttpsLocalHost
bir temsilciye ayarlayan TrustOverrideForUrl
bir nesne döndürürNSUrlSessionHandler
. Temsilci, IsHttpsLocalHost
URL ile https://localhost
başladığında döndürürtrue
.
Sonuçta elde edilen HttpClientHandler
nesne, hata ayıklama derlemeleri için oluşturucuya HttpClient
bağımsız değişken olarak geçirilebilir:
#if DEBUG
HttpsClientHandlerService handler = new HttpsClientHandlerService();
HttpClient client = new HttpClient(handler.GetPlatformMessageHandler());
#else
client = new HttpClient();
#endif
Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması daha sonra HTTPS üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin