You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 MAUI安卓端HttpClient二次POST抛出ObjectDisposedException问题

.NET 7 MAUI Android 中 HttpClient 后续请求抛出 ObjectDisposedException 的解决方法

可行解决方案

1. 复用 HttpClient 实例(推荐)

HttpClient 设计为可复用的长生命周期对象,频繁创建新实例会导致底层网络资源管理混乱,这在 Android 系统的资源回收机制下更容易触发异常。即使请求的 URI 不同,也可以通过传递完整请求地址来复用同一个 HttpClient:

步骤1:通过依赖注入注册单例 HttpClient

在 MauiProgram.cs 中注册全局单例 HttpClient,统一管理基础配置:

builder.Services.AddSingleton<HttpClient>(sp =>
{
    var client = new HttpClient();
    // 可在此添加全局通用请求头,动态 Token 可后续在业务代码中修改
    client.DefaultRequestHeaders.Add("Authorization", "your-initial-token");
    return client;
});

步骤2:在业务代码中注入并复用

在页面或 ViewModel 中注入 HttpClient,针对不同 URI 发送请求:

private readonly HttpClient _httpClient;

// 构造函数注入
public AuthViewModel(HttpClient httpClient)
{
    _httpClient = httpClient;
}

// 第一个请求
private async Task GetFirstToken()
{
    var content = new StringContent("", Encoding.UTF8, "application/json");
    var resp = await _httpClient.PostAsync("https://prod.trackmania.core.nadeo.online/v2/authentication/token/ubiservices", content);
    // 处理响应...
}

// 第二个不同 URI 的请求
private async Task GetSecondToken()
{
    var content = new StringContent("", Encoding.UTF8, "application/json");
    var resp = await _httpClient.PostAsync("https://another.api.domain/v1/auth/token", content);
    // 处理响应...
}

2. 手动指定 SocketsHttpHandler 替代默认 Handler

如果必须创建多个 HttpClient 实例,可使用 .NET 7 推荐的 SocketsHttpHandler 替代 Android 原生的 AndroidMessageHandler,避免系统自动回收底层资源:

var handler = new SocketsHttpHandler
{
    PooledConnectionLifetime = TimeSpan.FromMinutes(5), // 控制连接池存活时间
    AllowAutoRedirect = true
};

// 创建 HttpClient 并关联自定义 Handler
HttpClient client = new HttpClient(handler, disposeHandler: true);
client.BaseAddress = new Uri("https://prod.trackmania.core.nadeo.online/");
client.DefaultRequestHeaders.Add("Authorization", token);

var content = new StringContent("", Encoding.UTF8, "application/json");
var resp = await client.PostAsync("v2/authentication/token/ubiservices", content);

问题原因分析

  1. Android 资源回收机制:Android 系统在内存紧张时会自动回收未被强引用的对象。即使你没有手动调用 Dispose(),新建 HttpClient 底层关联的 Handler 可能被标记为可回收资源,若请求间隔存在延迟,系统会提前释放 Handler 持有的 Stream,导致后续请求报错。
  2. HttpClient 设计特性:HttpClient 本身是为长生命周期复用设计的,频繁创建实例会破坏底层 HTTP 连接池的管理逻辑,在 Android 严格的网络资源管控下,这种问题会被放大。
  3. MAUI 底层实现差异:.NET 7 MAUI 在 Windows 和 Android 上的 HttpClient 底层 Handler 实现不同,Windows 端的 Handler 资源管理更稳定,而 Android 端默认 Handler 存在资源回收优先级较高的问题。

为什么你之前的尝试无效?

  • AndroidMessageHandler 调整无效:无论 disposeHandler 设置为 true 或 false,每次新建 Handler 仍会被系统视为可回收对象,无法从根本上解决资源提前释放的问题。
  • usesCleartextTraffic 设置无关:该配置仅针对 HTTP 明文请求,你的请求使用 HTTPS,因此无任何影响。
  • HttpClient Implementation 选项缺失:.NET 7 MAUI 已移除旧版 Xamarin 的该配置项,默认使用基于 SocketsHttpHandler 的实现(Android 端可能 fallback 到 AndroidMessageHandler,但可手动指定替代)。

内容的提问来源于stack exchange,提问作者Ezio416

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:50:32