解决MAUI在Android上无法连接Web Api

最近在给自动异议做联网检查更新的功能,做完联网就拿去备案。但出乎意料的,HttpClient出现问题了。

问题描述

在Windows上调试时,使用HttpClient来发送网络请求能够正常获取返回的数据,但是部署到Android上运行时会遇到网络错误。

HttpClientService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class HttpClientService
{
private static HttpClient sharedClient = new()
{
BaseAddress = new Uri("http://example.com"),
//这只是一个示例地址
};
public static async Task<Model> GetVersionAsync()
{
try
{
using HttpResponseMessage response = await sharedClient.GetAsync("version");
response.EnsureSuccessStatusCode();
var jsonResponse = await response.Content.ReadAsStringAsync();
var versionInfo = JsonSerializer.Deserialize<Model>(jsonResponse);
return versionInfo;
}
catch (HttpRequestException e)
{
return null;
}
}
}

很正常的代码,看不出什么问题。但在Android上运行时必定会进入异常处理,然后返回一个null。

故障排查

检查应用网络权限,已经允许访问网络。
使用Android的浏览器访问Web Api,可以正常访问。
断点调试,没有在Android的特定平台代码发现问题。
换了一个公共api,可以正常访问了,仔细观察发现公共api配置了https,而我的api是http。

解决方案

使用https即可正常访问…
MAUI似乎在Android上禁用了明文流量,需要使用https。
如果非要用http的话,必须手动配置启用明文流量。
修改Android平台文件下的MainApplication.cs:

MainApplication.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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();
}

我选择使用https,签个ssl证书也不是什么麻烦事。

参考

从 Android 仿真器和 iOS 模拟器连接到本地 Web 服务