Xamarin Forms中HttpClient调用GetAsync无错崩溃问题求助
我之前在Xamarin项目里也碰到过一模一样的BadImageFormatException崩溃,结合你的配置(用了ModernHttpClient,Android设置了HttpClient实现为Android、Native TLS 1.2+),给你几个亲测有效的解决方案:
先试试移除ModernHttpClient
这大概率是最直接的解决办法。ModernHttpClient曾经是为了优化Xamarin的HttpClient性能而生,但现在Xamarin官方对HttpClient的实现已经做了大量优化,尤其是你已经开启了Native TLS 1.2+,完全不需要依赖这个第三方库了。而且新版本的Xamarin.Forms/Android SDK和ModernHttpClient的兼容性很差,很容易触发BadImageFormat这种底层格式不匹配的错误。
操作步骤:在NuGet包管理器里找到ModernHttpClient,直接卸载,然后清理项目的bin/obj文件夹,重新生成解决方案,再测试请求。检查Android项目的CPU架构配置
BadImageFormatException经常和CPU架构不兼容有关。打开你的Android项目属性,转到「Android选项」→「高级」,看看支持的ABI架构是否勾选了arm64-v8a、armeabi-v7a这些常用架构。如果只勾选了x86或者遗漏了64位架构,在64位设备上运行就会触发这个错误。
建议勾选所有常用架构,然后清理缓存重新编译。切换HttpClient实现类型
你当前设置的是「HttpClient实现=Android」,可以尝试切换成「Managed」模式试试。虽然Managed模式的性能略逊,但能帮你排除Native HttpClient和第三方库的冲突问题。如果切换后崩溃消失,说明是Android Native HttpClient和ModernHttpClient的适配问题,这时候就更坚定了移除ModernHttpClient的必要性。验证SSL证书与请求地址的兼容性
虽然日志显示的是BadImageFormat,但有时候TLS配置的异常也会伪装成这类错误。你可以用浏览器或者curl命令测试一下目标请求地址,确认它的SSL证书有效,并且确实支持TLS 1.2及以上版本。如果服务器端的TLS配置有问题,也可能导致客户端的HttpClient调用崩溃。
如果以上方法都试过还没解决,建议你更新Xamarin.Forms和Android SDK到最新稳定版,旧版本的SDK经常会有这类底层兼容性bug。
内容的提问来源于stack exchange,提问作者Noel

