是否可以将Audit.Net与httpClient一起使用以捕获外部请求

时间:2019-05-20 16:59:10

标签: dotnet-httpclient audit.net

是否可以使用Audit.Net与MVC.Core或WebAPI.Core中间件类似的方式为httpClient请求创建审核范围?

我已经尝试过类似的操作,但并没有取得太大的成功,通常会使应用程序超时。

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

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

1 个答案:

答案 0 :(得分:1)

我认为挂在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扩展来实现更简洁的实现。看看文档here