【问题标题】:Dispose of Injected HttpClient处理注入的 HttpClient
【发布时间】:2013-05-03 22:08:13
【问题描述】:

我们的 MVC 应用程序使用 HttpClient 调用 WebAPI 操作。我决定使用 StructureMap 注入 HttpClient 并在控制器中覆盖 dispose

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();
}

但我仍然违反规则。

【问题讨论】:

    标签: asp.net-mvc-4 dependency-injection asp.net-web-api structuremap dotnet-httpclient


    【解决方案1】:

    处理 HttpClient 会清除所有活动的取消令牌和任何部分完成的请求/响应。在大多数正常情况下,处理它不是必需的,尽管按照惯例你应该这样做。请注意,虽然处理 HttpClient 将强制关闭 TCP 连接。

    如果您的 MVC 应用程序对同一服务器进行大量调用,则可能值得跨请求保留 HttpClient 实例并重用它。这将避免您每次都必须重新设置默认请求标头,并且允许重用 TCP 连接。

    【讨论】:

      【解决方案2】:

      触发创建对象的对象通常也是负责处理它的对象。在这种情况下,HttpClient 由 Structuremap 通过DependencyResolverControllerFactory 创建。使用 Structuremap 处理瞬态对象没有简单的方法,因此您希望最大限度地减少IDisposable 对象的注入,尤其是瞬态对象。我认为您应该将创建和处置放在服务中,然后将其注入控制器。

      ReleaseAndDisposeAllHttpScopedObjects 在这种情况下不起作用,因为它只处理配置为 HttpScoped 的对象,即在整个 http 请求期间保留的对象。

      【讨论】:

      • 这有帮助。感谢您的输入。如果我在 StructureMap 中使用“HttpContextScoped”,ReleaseAndDisposeAllHttpScopedObjects 会起作用吗?
      • @jlembke - 是的,HttpContextScoped ReleaseAndDisposeAllHttpScopedObjects 方法可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多