.Net MAUI Android 无法与 API localhost 通信
.Net MAUI Android can't talk to API localhost
我在这里下载了最新的 MAUI 示例:https://github.com/microsoft/dotnet-podcasts 并复制了他们提出请求的确切方式,但我无法通过 'unexpected end of stream error':
System.Net.WebException: unexpected end of stream on com.android.okhttp.Address@4c288121
---> Java.IO.IOException: unexpected end of stream on com.android.okhttp.Address@4c288121
我正在通过 AddHttpClient
工厂方法在 MauiProgram.cs 中初始化 HttpClient
(注意 Andorid 的不同 IP 地址):
public static string Base = DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2" : "https://localhost";
public static string APIUrl = $"{Base}:7096/api/";
builder.Services.AddHttpClient<DishClient>(client => { client.BaseAddress = new Uri(APIUrl); });
我在 AndroidManifest.xml(允许 http 流量)中包含以下 android:networkSecurityConfig
:
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Xamarin 中的解决方案似乎是使用 AndroidClientHandler
,但这是一个我不能在 MAUI 中使用的已弃用的库,并且在有效的链接解决方案中没有引用它。
我尝试过的事情:
使用 Https:我已遵循此处的指南:https://docs.microsoft.com/en-us/xamarin/cross-platform/deploy-test/connect-to-local-web-services#bypass-the-certificate-security-check 但我仍然遇到证书错误:
System.Net.WebException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
---> Javax.Net.Ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
我也试过这个
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
但是报错
System.PlatformNotSupportedException: Operation is not supported on this platform
已经连续 4 天了,我已经检查了工作解决方案中所有可能的设置,但没有发现任何差异。有什么想法吗?
@Jimmy 在您的代码中,当您在 android 上 运行 时,您正在将 URL 从 "https://localhost"
更改为 "http://10.0.2.2"
。在这两种情况下,您都在 7096 端口调用 API:
public static string APIUrl = $"{Base}:7096/api/";
。对于 android,您使用的是 HTTP 协议,而在所有其他情况下,您使用的是 HTTPS。
我假设您的服务器仅在端口 7096 上侦听 HTTPS,而不侦听 HTTP。也许这会导致您的问题。
另一个问题可能是您的服务仅绑定到 localhost
而不是您的 IP 地址(您可以在 API 的 launchsettings.json 中查找)。
另一个问题可能是您的防火墙不允许端口 7096 上的传入流量。您也应该检查一下,因为当您 运行 在 [=31] 上时您没有跨越机器边界=].但是,在 Android 模拟器上 运行 时,您有 cross-machine 通信。
我在这里下载了最新的 MAUI 示例:https://github.com/microsoft/dotnet-podcasts 并复制了他们提出请求的确切方式,但我无法通过 'unexpected end of stream error':
System.Net.WebException: unexpected end of stream on com.android.okhttp.Address@4c288121
---> Java.IO.IOException: unexpected end of stream on com.android.okhttp.Address@4c288121
我正在通过 AddHttpClient
工厂方法在 MauiProgram.cs 中初始化 HttpClient
(注意 Andorid 的不同 IP 地址):
public static string Base = DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2" : "https://localhost";
public static string APIUrl = $"{Base}:7096/api/";
builder.Services.AddHttpClient<DishClient>(client => { client.BaseAddress = new Uri(APIUrl); });
我在 AndroidManifest.xml(允许 http 流量)中包含以下 android:networkSecurityConfig
:
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Xamarin 中的解决方案似乎是使用 AndroidClientHandler
,但这是一个我不能在 MAUI 中使用的已弃用的库,并且在有效的链接解决方案中没有引用它。
我尝试过的事情:
使用 Https:我已遵循此处的指南:https://docs.microsoft.com/en-us/xamarin/cross-platform/deploy-test/connect-to-local-web-services#bypass-the-certificate-security-check 但我仍然遇到证书错误:
System.Net.WebException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
---> Javax.Net.Ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
我也试过这个
handler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
但是报错
System.PlatformNotSupportedException: Operation is not supported on this platform
已经连续 4 天了,我已经检查了工作解决方案中所有可能的设置,但没有发现任何差异。有什么想法吗?
@Jimmy 在您的代码中,当您在 android 上 运行 时,您正在将 URL 从 "https://localhost"
更改为 "http://10.0.2.2"
。在这两种情况下,您都在 7096 端口调用 API:
public static string APIUrl = $"{Base}:7096/api/";
。对于 android,您使用的是 HTTP 协议,而在所有其他情况下,您使用的是 HTTPS。
我假设您的服务器仅在端口 7096 上侦听 HTTPS,而不侦听 HTTP。也许这会导致您的问题。
另一个问题可能是您的服务仅绑定到 localhost
而不是您的 IP 地址(您可以在 API 的 launchsettings.json 中查找)。
另一个问题可能是您的防火墙不允许端口 7096 上的传入流量。您也应该检查一下,因为当您 运行 在 [=31] 上时您没有跨越机器边界=].但是,在 Android 模拟器上 运行 时,您有 cross-machine 通信。