Я думаю, что единственный способ подключиться к HttpClient
- это использовать пользовательский HttpClientHandler
, чтобы вы могли перехватывать остальные вызовы.
Просто в качестве примера:
public class AuditClientHandler : HttpClientHandler
{
protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var options = new AuditScopeOptions()
{
EventType = $"{request.Method.Method} {request.RequestUri.AbsoluteUri}",
CreationPolicy = EventCreationPolicy.InsertOnStartReplaceOnEnd,
ExtraFields = new
{
request = GetRequestAudit(request)
}
};
using (var scope = AuditScope.Create(options))
{
var response = await base.SendAsync(request, cancellationToken);
scope.SetCustomField("response", GetResponseAudit(response));
return response;
}
}
}
Я использовал политику создания InsertOnStartReplaceOnEnd
, поэтому запрос сохраняется до его отправки на сервер, а ответ добавляется к событию и сохраняется впоследствии.
Реализация GetRequestAudit
/ GetResponseAudit
зависит от вас, просто верните объект (который можно сериализовать) с информацией, которую вы хотите зарегистрировать.
Таким образом, каждый раз, когда вам необходимо проверить экземпляр HttpClient
, вам нужно передать обработчик его конструктору:
var cli = new HttpClient(new AuditClientHandler());
var response = await cli.GetAsync("http://google.com");
В любом случае, я оценю предоставление новой библиотеки (Audit.HttpClient
?) С настраиваемым обработчиком, чтобы реализация могла быть чище.
Обновление
Теперь вы можете использовать расширение Audit.HttpClient для более чистой реализации. Взгляните на документацию здесь