Получение общего журнала с Polly, DI HttpClient и HttpMessageHandlers

У меня есть класс, который обертывает DI'ed HttpClient и имеет некоторую стандартную функцию, использующую Polly. Я бы унаследовал классы от этого класса HttpClientEx и использовал бы его общие функции в другом моем коде.

Недавно появилось требование, чтобы наши сообщения к / от httpclient регистрировались. Я добавил HttpMessageHandler, который реализовал некоторые общие функции ведения журнала, но теперь у меня проблема:

Когда я вызываю любой из своих Gets / Posts и т. Д. С помощью Polly:

await polPolly.ExecuteAsync(async(ctCancelToken)=>
{
        return await HttpClient.GetAsync(sUrl, ctCancelToken);
}, CancellationToken.None);

Это вызывает исключение: невозможно получить доступ к удаленному объекту. Имя объекта: 'System.Net.Http.HttpConnection + HttpConnectionResponseContent'

Я читал в Интернете, что это могло быть потому, что я не делаю свой обработчик сообщений «повторно используемым», и что Полли вызывает его удаление, вызывая эту проблему. Все примеры, которые я вижу для HttpMessageHandlers, которые обращаются к этому, показывают новый HttpClient (SomeMessageHandler, false) как «исправление» ... НО: Это не исправление. Вы даже не должны использовать HttpClient таким образом. Предполагается, что он будет УМЕРТЬ ...

Возникает вопрос: как указать, что мой обработчик можно использовать повторно, чтобы он соответствовал правильному способу использования HttpClient? Я открыт для использования IHttpClientFactory или Typed HttpClients.... Подойдет любой вариант. Кажется, я не могу найти способ настроить это свойство.

Спасибо!

Джеймс


person James Scott    schedule 19.11.2019    source источник
comment
IHttpClientFactory, безусловно, правильно управляет временем жизни обработчика HttpClient и удалением обработчика для вас. Polly не удаляет обработчики сообщений Http или содержимое (не удаляет объекты, которыми не владеет). Исключение читается так, как будто оно сообщает вам, что HttpContent в ответе был удален. Примечания здесь и здесь вокруг удаления содержимого HttpResponse может быть полезным.   -  person mountain traveller    schedule 20.11.2019


Ответы (1)


@ Путешественник по горам - Вот и все. Я утилизировал свой HttpResponseMessage в своем пользовательском обработчике. Я не должен был быть.

Спасибо за информацию.

person James Scott    schedule 21.11.2019