处理注入的HttpClient

时间:2013-05-03 22:08:14

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

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

但我仍然违反规则。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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