处置注入的HttpClient(Dispose of Injected HttpClient)

2019-09-01 23:00发布

我们的MVC应用程序调用使用HttpClient的一个动作的WebAPI。 我决定要注入的HttpClient使用StructureMap的并覆盖在处置控制器

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

protected override void Dispose(bool disposing)
{
   if (disposing && _httpClient != null)
   {
       _httpClient.Dispose();
   }
   base.Dispose(disposing);
}

该StructureMap ObjectInitialize基本上是这样的..

x.For<HttpClient>().Use(() => new HttpClient() { BaseAddress = "my/uri/"});

当我建立这个,CodeAnalysis笙歌"Dispose objects before losing scope" ,并指向IoC的代码。

我能够抑制,或者我需要处置的HttpClient? 我也试过

protected void Application_EndRequest(object sender, EventArgs e)
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

但我仍然得到那个违反规则。

Answer 1:

设置的HttpClient清理任何活性取消令牌和任何部分完成的请求/响应。 在大多数情况下正常处置它不会是必要的,但按照惯例,你应该。 要知道,虽然配置的HttpClient将强行关闭TCP连接。

如果你的MVC应用程序正在大量调用同一服务器的,它可能是值得持有到跨请求HttpClient的实例和重用它。 这将避免你不得不重新设置默认的请求头每一次,它会允许TCP连接的重用。



Answer 2:

触发一个对象的创建的对象通常是一个负责设置它。 在这种情况下HttpClient的由Structuremap经由所创建的DependencyResolverControllerFactory 。 有没有简单的方法来处理瞬时对象与Structuremap,所以要尽量减少注射IDisposable对象,尤其是那些瞬间。 我认为,你应该把创造和处置服务,并注入该控制器来代替。

ReleaseAndDisposeAllHttpScopedObjects不会在这种情况下工作,因为它只部署配置对象HttpScoped ,那就是在整个HTTP请求的过程中保持对象。



文章来源: Dispose of Injected HttpClient