.NET MAUI发布模式下反序列化HTTP请求数据时崩溃
问题分析与排查步骤
核心异常解读
System.Text.Json.JsonReaderException: ExpectedStartOfValueNotFound, 0x1F 这个异常说明JSON解析器尝试读取接口响应时,没找到有效的JSON起始标记(比如{或[),反而读到了0x1F——这是ASCII的单元分隔符,大概率是响应内容被压缩但客户端没处理,或是响应内容格式异常导致的。
可能原因与排查方向
1. 发布模式下HttpClient未启用压缩支持
调试模式可能默认开了自动解压,但发布模式的优化把这个功能关了。如果你的Web API返回gzip/deflate压缩后的响应,客户端直接解析二进制压缩数据,就会出现这种错误(0x1F正是gzip压缩的起始标识位)。
排查&解决:
- 给HttpClient配置自动解压:
var handler = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; var httpClient = new HttpClient(handler); - 要是API需要主动声明才返回压缩响应,手动添加请求头:
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
2. 发布模式代码裁剪误删关键逻辑
.NET MAUI发布模式默认开了代码裁剪和优化,可能把HttpClient或JSON序列化相关的核心代码误裁剪了,导致响应读取、解析逻辑失效。
排查&解决:
- 临时在
.csproj里关闭代码裁剪,测试是否还崩溃:<PropertyGroup Condition="'$(Configuration)' == 'Release'"> <LinkerBehavior>None</LinkerBehavior> </PropertyGroup> - 如果关闭后恢复正常,给相关程序集加裁剪豁免:
<ItemGroup Condition="'$(Configuration)' == 'Release'"> <TrimmerRootAssembly Include="System.Text.Json" /> <TrimmerRootAssembly Include="System.Net.Http" /> </ItemGroup>
3. 响应内容读取或编码异常
发布模式下,响应流的读取方式可能和调试模式不一致,比如没读完响应就解析,或者编码不匹配导致内容乱码。
排查&解决:
- 解析JSON前,先完整读取响应内容并上报到Sentry或写入本地日志,确认实际收到的是不是有效JSON:
var response = await httpClient.PostAsync(authUrl, content); var rawContent = await response.Content.ReadAsStringAsync(); // 把rawContent上报到Sentry或者写入本地文件 var result = JsonSerializer.Deserialize<AuthResponse>(rawContent); - 检查响应头的
Content-Type是不是application/json; charset=utf-8,如果编码不是UTF-8,指定编码读取:var rawContent = await response.Content.ReadAsStringAsync(Encoding.UTF8);
4. Android发布模式的网络权限/代理问题
Android发布模式下可能没配置好网络权限,或者模拟器代理设置导致响应被篡改。
排查&解决:
- 确认
AndroidManifest.xml里加了网络权限:<uses-permission android:name="android.permission.INTERNET" /> - 关闭模拟器的代理设置,测试是否能正常获取响应;或者在发布模式下禁用代理自动配置。
内容的提问来源于stack exchange,提问作者Chris Boot
相关产品推荐
相关产品推荐

