Xamarin迁移至.NET8后HttpClient明文通信启用失败求助
问题场景
将Xamarin/C#应用迁移至.NET8后,调用var response = await httpClient.GetAsync(resource);时触发错误:
CLEARTEXT communication not enabled for client
已完成的配置:
- AndroidManifest.xml中已添加
android:usesCleartextTraffic="true"和android:networkSecurityConfig="@xml/network_security_config" - 网络安全配置文件
network_security_config.xml设置了<base-config cleartextTrafficPermitted="true"/> - 已声明
INTERNET权限 - 原Xamarin环境下运行正常,迁移至.NET8后出现报错
解决步骤
1. 检查资源文件路径与命名
确认network_security_config.xml放置在.NET8 Android项目的Resources/xml目录下(注意目录名需为小写的xml),文件名与Manifest中的引用完全一致,无拼写错误。
2. 验证最终合并的Manifest配置
.NET8 Android会自动合并来自NuGet包、依赖库的Manifest配置,可能覆盖你的设置。打开项目obj\Debug\net8.0-android\AndroidManifest.xml,查看最终合并后的<application>标签,确认android:usesCleartextTraffic="true"是否存在且未被覆盖。
3. 针对特定域名配置CLEARTEXT(推荐)
避免全局开启CLEARTEXT,改为针对目标HTTP域名单独配置,减少冲突概率:
<network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">你的目标域名.com</domain> </domain-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>
4. 显式指定HttpClient的Handler
.NET8 Android中HttpClient默认使用AndroidMessageHandler,尝试显式创建并配置Handler:
var handler = new AndroidMessageHandler(); handler.AllowAutoRedirect = true; using var httpClient = new HttpClient(handler); var response = await httpClient.GetAsync(resource);
5. 排查targetSdkVersion限制
targetSdkVersion 30+对CLEARTEXT通信限制更严格,检查网络安全配置文件是否存在语法错误(如标签未闭合、属性拼写错误),可借助Android Studio的Manifest验证工具排查。
6. 清理重建项目
执行Build -> Clean Solution,手动删除项目的bin和obj目录,再重新构建,避免缓存的旧配置干扰。
内容的提问来源于stack exchange,提问作者C Morell

