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

使用HttpClientFactory时出现Cannot access a disposed object异常的解决

问题:调用HttpClient时抛出“Cannot access a disposed object”异常

我在实现一个向外部RestAPI提交数据的服务,运行时调用HttpClient发送请求时触发了“Cannot access a disposed object”异常,相关实现细节如下:

服务实现代码

1. 服务定义

public class ExternalOutputService : IExternalOutputService
{
    private readonly HttpClient _httpClient;

    public ExternalOutputService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task<object> Send(object data, string baseAddress, string uri)
    {
        try
        {
            HttpResponseMessage response = await _httpClient.PostAsJsonAsync(uri, data);
            response.EnsureSuccessStatusCode();

        }
        catch (Exception ex) {
            Console.Write(ex.Message);
        }

        return response.Content;
    }  
}

2. Startup中的服务注册

services.AddHttpClient<IExternalOutputService, ExternalOutputService>();

3. 注入并调用服务

public class ConfigurableOutput
{
    private readonly IExternalOutputService _externalOutputService;
    public ConfigurableOutput(IExternalOutputService externalOutputService) 
    {
        _externalOutputService = externalOutputService;
    }
    public override async Task<object> Run(object input)
    {
       await _externalOutputService.Send(input.data, "URI address");
    }
 }

排查与解决

经过排查发现,问题出在服务的重复注册上:在另一个DI扩展类中,IExternalOutputService被额外注册为了Transient服务:

context.Services.AddTransient<IExternalOutputService, ExternalOutputService>();

移除这一行,只保留services.AddHttpClient<IExternalOutputService, ExternalOutputService>()的注册后,异常彻底解决。

原因说明

AddHttpClient方法会自动管理HttpClient的生命周期(通过创建HttpClient实例池,避免频繁创建和释放导致的问题),同时为对应的服务注册合适的生命周期。而手动添加的AddTransient注册会绕过这个管理机制,导致HttpClient被过早释放,当后续代码尝试访问已释放的HttpClient对象时,就会抛出“Cannot access a disposed object”异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:15:37