.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 通信。