Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Просмотрите пример. Обзор примера
Многие мобильные и настольные приложения используют веб-службы. На этапе разработки программного обеспечения обычно развертывается веб-служба локально и используется из приложения, работающего в эмуляторе Android или симуляторе iOS. Это позволяет избежать необходимости развертывать веб-службу в размещенной конечной точке и выполнять простую отладку, так как приложение и веб-служба выполняются локально.
Подсказка
Если вы используете .NET 10 или более поздней версии, попробуйте использовать интеграцию Aspire , чтобы упростить подключение к локальным веб-службам. Aspire автоматически выполняет конфигурацию сети для конкретной платформы, обнаружение служб и создание туннелей разработки, устраняя необходимость в значительной части ручной настройки, описанной в этой статье.
Приложения .NET MAUI (многоплатформенный интерфейс пользовательского интерфейса приложений .NET), работающие на Windows или MacCatalyst, могут использовать веб-службы ASP.NET Core, запускаемые локально по протоколу HTTP или HTTPS, без дополнительной работы, при условии, что вы доверили сертификат разработки. Однако при работе приложения в эмуляторе Android или симуляторе iOS требуется дополнительная работа, а процесс отличается в зависимости от того, работает ли веб-служба по протоколу HTTP или HTTPS.
Адрес локального компьютера
Эмулятор Android и симулятор iOS предоставляют доступ к веб-службам, работающим через HTTP или HTTPS на локальном компьютере. Но адреса локального компьютера при этом будут разными.
Android
Каждый экземпляр Android Emulator изолирован от сетевых интерфейсов компьютера разработки с помощью виртуального маршрутизатора. Таким образом, эмулируемое устройство не может видеть компьютер разработки или другие экземпляры эмулятора в сети.
Виртуальный маршрутизатор каждого эмулятора управляет специализированным сетевым пространством, которое имеет предварительно выделенные адреса, а адрес 10.0.2.2 является псевдонимом для локального интерфейса обратной связи на ваш узел (127.0.0.1 на компьютере разработки). Таким образом, учитывая локальную веб-службу, которая предоставляет операцию GET через /api/todoitems/ относительный URI, приложение, работающее в эмуляторе Android, может использовать операцию, отправив запрос GET на http://10.0.2.2:<port>/api/todoitems/ или https://10.0.2.2:<port>/api/todoitems/.
iOS
iOS Simulator использует сеть главного компьютера. Таким образом, приложения, работающие в эмуляторе, могут подключаться к веб-службам, работающим на локальном компьютере, через IP-адрес компьютера или через имя узла localhost. Например, учитывая локальную веб-службу, которая предоставляет операцию GET через /api/todoitems/ относительный URI, приложение, работающее на симуляторе iOS, может выполнить операцию, отправив GET-запрос на http://localhost:<port>/api/todoitems/ или https://localhost:<port>/api/todoitems/.
Примечание.
При запуске приложения .NET MAUI в симуляторе iOS на Windows, приложение отображается в удаленном симуляторе iOS для Windows. Однако приложение работает на подключённом Mac. Поэтому нет доступа localhost к веб-службе, работающей в Windows для приложения iOS, работающего на Компьютере Mac.
Локальные веб-службы, работающие по протоколу HTTP
Приложение .NET MAUI, работающее в эмуляторе Android или симуляторе iOS, может использовать веб-службу ASP.NET Core, которая работает локально по протоколу HTTP. Это можно сделать, настроив проект приложения .NET MAUI и проект веб-службы ASP.NET Core, чтобы разрешить чистый текстовый трафик HTTP.
В коде, который определяет URL-адрес локальной веб-службы в приложении .NET MAUI, убедитесь, что URL-адрес веб-службы указывает схему HTTP и правильное имя узла. Класс DeviceInfo можно использовать для определения платформы, на которой работает приложение. Затем можно задать правильное имя узла следующим образом:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Дополнительные сведения о классе см. в разделе Сведения об устройстве DeviceInfo.
При этом для запуска приложения на Android необходимо добавить требуемую сетевую конфигурацию, а для запуска приложения на iOS необходимо отказаться от Apple Transport Security (ATS). Дополнительные сведения см. в разделах "Конфигурация сети Android" и "Конфигурация iOS ATS".
Кроме того, необходимо убедиться, что веб-служба ASP.NET Core настроена для разрешения HTTP-трафика. Это можно сделать, добавив профиль HTTP в раздел profiles в файле launchSettings.json вашего проекта веб-службы ASP.NET Core.
{
...
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "api/todoitems",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
...
}
}
Приложение .NET MAUI, работающее в эмуляторе Android или симуляторе iOS, может воспользоваться веб-службой ASP.NET Core, которая работает локально по протоколу HTTP, если веб-служба запускается с http профилем.
Конфигурация сети Android
Существует два основных подхода к включению локального трафика с четким текстом в Android:
- Включите сетевой трафик с четким текстом для обмена данными со всеми доменами. Дополнительные сведения см. в разделе «Включение нешифрованного сетевого трафика для всех доменов».
- Включите сетевой трафик в открытом тексте для обмена данными с доменом
localhost. Дополнительные сведения см. в разделе Включить незашифрованный сетевой трафик для домена localhost.
Включение нешифрованного сетевого трафика для всех доменов
Сетевой трафик в открытом тексте для всех доменов можно включить, установив свойство UsesCleartextTraffic атрибута Application на true. Это должно быть выполнено в файле
#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();
}
Примечание.
Свойство UsesCleartextTraffic игнорируется в Android 7.0 (API 24) и выше, если существует файл конфигурации сетевой безопасности.
Включение сетевого трафика с четким текстом для домена localhost
Сетевой трафик в открытом виде для домена localhost можно разрешить, создав файл конфигурации безопасности сети. Это можно сделать, добавив новый XML-файл с именем network_security_config.xml в папку Platform\Android\Resources\xml в проекте приложения .NET MAUI. XML-файл должен содержать следующую конфигурацию:
<?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>
Примечание.
Убедитесь, что для действия сборки файла network_security_config.xml установлено значение AndroidResource.
Затем настройте свойство networkSecurityConfig на узле application в файле Platforms\Android\AndroidManifest.xml в проекте приложения .NET MAUI.
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application android:networkSecurityConfig="@xml/network_security_config" ...>
...
</application>
</manifest>
Дополнительные сведения о файлах конфигурации безопасности сети см. в разделе «Конфигурация безопасности сети» на сайте developer.android.com.
Конфигурация iOS ATS
Чтобы включить незашифрованный локальный трафик на iOS, вам следует отключить защиту транспорта Apple (ATS) в вашем приложении .NET MAUI. Это можно сделать, добавив следующую конфигурацию в файл Platform\iOS\Info.plist в проекте приложения .NET MAUI:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Дополнительные сведения об ATS см. в разделе "Запрет небезопасных сетевых подключений" на сайте developer.apple.com.
Локальные веб-службы, работающие по протоколу HTTPS
Приложение .NET MAUI, работающее в эмуляторе Android или симуляторе iOS, может использовать веб-службу ASP.NET Core, которая работает локально по протоколу HTTPS. Этот процесс включается следующим образом:
- Доверьтесь самозаверяющему сертификату для разработки на вашем компьютере. Дополнительные сведения см. в разделе Убедитесь в надёжности вашего сертификата разработки.
- Укажите адрес своего локального компьютера. Дополнительные сведения см. в разделе «Указание адреса локального компьютера».
- Обойдите проверку безопасности локального сертификата разработки. Дополнительные сведения см. в разделе Обход проверки безопасности сертификата.
Далее последовательно рассматриваются все эти этапы.
Доверять сертификату разработки
Установка пакета SDK для .NET Core устанавливает сертификат разработки ASP.NET Core HTTPS в хранилище сертификатов локального пользователя. Хотя сертификат установлен, он не является доверенным. Чтобы довериться сертификату, выполните следующий однократный шаг для запуска средства dotnet dev-certs.
dotnet dev-certs https --trust
Следующая команда предоставляет справку о средстве dev-certs.
dotnet dev-certs https --help
Кроме того, при запуске проекта ASP.NET Core 2.1 (или следующих версий), использующего протокол HTTPS, Visual Studio проверяет наличие сертификата разработки и предлагает установить его и сделать доверенным.
Примечание.
Сертификат разработки ASP.NET Core HTTPS является самоподписанным.
Дополнительные сведения о включении HTTPS на вашем компьютере см. в разделе Включение локального HTTPS.
Указание адреса локального компьютера
В коде, определяющем URL-адрес локальной веб-службы в приложении .NET MAUI, убедитесь, что URL-адрес веб-службы указывает схему HTTPS и правильное имя узла. Класс DeviceInfo можно использовать для определения платформы, на которой работает приложение. Затем можно задать правильное имя узла следующим образом:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Дополнительные сведения о классе см. в разделе Сведения об устройстве DeviceInfo.
Обход проверки безопасности сертификата
При попытке вызвать локальную безопасную веб-службу из приложения .NET MAUI, работающего в эмуляторе Android, будет выброшено исключение java.security.cert.CertPathValidatorException, с сообщением, указывающим, что доверительный якорь для пути сертификации не найден. Аналогично, попытка вызвать локальную безопасную веб-службу из приложения на .NET MAUI, работающего в симуляторе iOS, приведет к NSURLErrorDomain ошибке с сообщением о том, что сертификат сервера недействителен. Эти ошибки возникают из-за того, что локальный сертификат разработки HTTPS является самоподписанным, а самоподписанные сертификаты не вызывают доверия у Android и iOS. Поэтому необходимо игнорировать ошибки SSL, когда приложение использует локальную безопасную веб-службу.
Это можно сделать, настроив экземпляр HttpClientHandler с пользовательским параметром ServerCertificateCustomValidationCallback, что позволяет HttpClient доверять коммуникации с localhost по протоколу HTTPS. В следующем примере показано, как создать экземпляр HttpClientHandler, который будет игнорировать ошибки проверки сертификата на локальном сервере.
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);
Внимание
Приведенный выше код игнорирует ошибки проверки сертификата localhost, но только в отладочных сборках. Этот подход позволяет избежать инцидентов безопасности в рабочих сборках.
Затем приложение .NET MAUI, работающее в эмуляторе Android или симуляторе iOS, может использовать веб-службу ASP.NET Core, которая работает локально по протоколу HTTPS.