3

Наше приложение MVC вызывает действие WebAPI с использованием HttpClient. Я решил впрыснуть HttpClient с помощью StructureMap и переопределить выбрасывайте в контроллереУтилизация Injected 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/"}); 

Когда я строю это, CodeAnalysis жалуется "Dispose objects before losing scope" и указывает на IoC код.

Могу ли я подавить это, или где мне нужно избавиться от HttpClient? Я также пробовал

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

Но я все еще получаю нарушение этого правила.

ответ

5

Устранение HttpClient очищает любые активные маркеры отмены и любые частично заполненные запросы/ответы. В большинстве обычных сценариев утилизация не будет существенной, хотя по соглашению вы должны. Имейте в виду, что удаление HttpClient приведет к принудительному закрытию TCP-соединения.

Если ваше приложение MVC делает много вызовов на одном и том же сервере, возможно, стоит удержать экземпляр HttpClient через запросы и повторно использовать его. Это позволит избежать повторной настройки заголовков запросов по умолчанию каждый раз, и это позволит повторно использовать TCP-соединение.

3

Объект, который запускает создание объекта, обычно является ответственным за его удаление. В этом случае HttpClient создается Structuremap через DependencyResolver или ControllerFactory. Нет простого способа распоряжаться переходными объектами с помощью Structuremap, поэтому вы хотите свести к минимуму инъекции объектов IDisposable, особенно переходных. Я думаю, что вы должны поместить создание и удаление в службу и вместо этого ввести его в контроллер.

ReleaseAndDisposeAllHttpScopedObjects не будет работать в этом случае, поскольку он располагает только объекты, сконфигурированные как HttpScoped, то есть объекты, которые хранятся в течение всего HTTP-запроса.

+0

Это помогло. Спасибо за ваш вклад. Если я использовал «HttpContextScoped» в StructureMap, будет ли ReleaseAndDisposeAllHttpScopedObjects работать? – jlembke

+1

@jlembke - Да, с 'HttpContextScoped' метод' ReleaseAndDisposeAllHttpScopedObjects' будет работать. – PHeiberg