Asp.net mvc 4 处置注入的HttpClient

Asp.net mvc 4 处置注入的HttpClient,asp.net-mvc-4,dependency-injection,asp.net-web-api,structuremap,dotnet-httpclient,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 !

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

但我仍然违反了规则。

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


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

触发对象创建的对象通常也是负责处理该对象的对象。在这种情况下,HttpClient由Structuremap通过
DependencyResolver
ControllerFactory
创建。使用Structuremap处理瞬态对象并不容易,因此您希望尽量减少
IDisposable
对象的注入,尤其是瞬态对象。我认为您应该将创建和处置放在服务中,并将其注入控制器


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

这很有帮助。谢谢你的意见。如果我在StructureMap中使用“HttpContextScoped”,Release和DisposeAllHttpScopedObjects会工作吗?@jlembke-是的,使用
HttpContextScoped
时,
ReleaseAndDisposeAllHttpScopedObjects
方法会工作。
protected void Application_EndRequest(object sender, EventArgs e)
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}