Asp.net mvc 4 处置注入的HttpClient
我们的MVC应用程序使用HttpClient调用WebAPI操作。我决定使用StructureMap注入HttpClient,并覆盖控制器中的disposeAsp.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 !
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();
}