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

为什么.NET Core单元测试中HttpClient第二次重试时会被释放?

问题产生原因

  • GetResponse方法中使用了using关键字声明HttpClient实例,该语法会在GetResponse方法执行结束后自动释放创建的HttpClient对象。
  • 单元测试中模拟IHttpClientFactory时,配置了factory.CreateClient(Arg.Any<string>()).Returns(httpClient, httpClient),意味着两次调用CreateClient方法返回的是同一个HttpClient对象实例。
  • 第一次执行GetResponse完成后,你创建的单例HttpClient已经被using自动释放,第二次重试时从模拟工厂拿到的还是这个已经被释放的实例,调用PostAsync方法自然会抛出对象已被释放的异常。

修复方案

修改模拟IHttpClientFactory的逻辑,每次调用CreateClient都返回全新的HttpClient实例即可,StubHttpMessageHandler可以复用不需要重复创建:

var messageHandler = new StubHttpMessageHandler(HttpStatusCode.InternalServerError, "Error!!!!");
var factory = Substitute.For<IHttpClientFactory>();
factory.CreateClient(Arg.Any<string>()).Returns(_ => new HttpClient(messageHandler)
{
    BaseAddress = new Uri("http://mockuri")
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:00:02