Можно ли использовать Audit.Net с httpClient для захвата внешних запросов - PullRequest
1 голос
/ 20 мая 2019

Используя Audit.Net, возможно ли создать область аудита для запросов httpClient, аналогично промежуточному программному обеспечению MVC.Core или WebAPI.Core?

Я пробовал что-то вроде этого, но не добился большого успеха, обычно это приводит к превышению времени ожидания приложения.

AuditScope scope = null;
try {
 using(HttpClient client = new HttpClient) {

  scope = await AuditScope.CreateAsync("",() => client)
  // code to initialise the Httpclient
 }
}
finally {
 await scope.DisposeAsync();
}

1 Ответ

1 голос
/ 21 мая 2019

Я думаю, что единственный способ подключиться к 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 для более чистой реализации. Взгляните на документацию здесь

...