是否可以使用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();
}
答案 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