使用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
相关产品推荐
相关产品推荐

