Xamarin Android中HttpClient.GetAsync引发类型初始化异常,求解决方法
这个问题我之前帮朋友排查过类似的,Xamarin Android和WPF在.NET HttpClient的依赖处理上确实有差异,给你几个针对性的排查方向:
检查System.Net.Http相关包的版本兼容性
Xamarin Android对NuGet包的兼容性要求比WPF更严格,别混用.NET Framework和.NET Standard版本的System.Net.Http包。建议先卸载现有相关包,重新安装适配Xamarin Android的版本,比如执行NuGet命令:Install-Package System.Net.Http -Version [适配Xamarin的稳定版本]安装时注意看包描述是否明确支持Xamarin.Android。
补充格式化相关依赖包
System.Net.Http.FormattingUtilities属于System.Net.Http.Formatting组件,Xamarin Android项目不会像WPF那样默认包含这个依赖。可以尝试安装Microsoft.AspNet.WebApi.Client包,它包含了HttpClient格式化所需的工具类,很多时候缺这个包就会触发类型初始化异常。调整链接器和目标框架设置
Xamarin的链接器(Linker)可能误删了FormattingUtilities的依赖代码:- 打开项目属性,进入Android Options -> Linker,把链接行为改成
Sdk Assemblies Only,调试阶段可以临时设为None测试; - 确认项目目标Android版本不要太老,建议升级到Android 11及以上的稳定版本,老版本API对HttpClient的支持存在兼容性问题。
- 打开项目属性,进入Android Options -> Linker,把链接行为改成
切换HttpClient的实现方式
Xamarin默认的Managed HttpClient实现可能存在适配问题,你可以切换到Android原生网络栈:
在项目属性的Android Options -> Advanced里,将HttpClient实现改为AndroidClientHandler,改用系统原生的网络处理逻辑,大概率能避开格式化组件的初始化异常。手动触发类型初始化
在调用await client.GetAsync()之前,手动触发FormattingUtilities的初始化,比如访问它的静态成员:// 强制CLR加载FormattingUtilities类型 var dummy = System.Net.Http.Formatting.FormattingUtilities.DefaultMediaType;强制加载后再执行网络请求,可能绕过初始化异常。
内容的提问来源于stack exchange,提问作者Steini

