如何自动将自定义委派处理程序设置为所有 HttpClient?



我想为应用程序中的所有客户端使用 LoggingHttpClientHandler。我通过命名/类型客户端找到了唯一可用的方法

启动.cs

services.AddTransient<LoggingHttpClientHandler>();
services.AddHttpClient("clientWithLogging").AddHttpMessageHandler<LoggingHttpClientHandler>();

然后在每项服务中,我都必须使用var client = _clientFactory.CreateClient("clientWithLogging")这有点不舒服。

LoggingHttpClientHandler.cs

public class LoggingHttpClientHandler : DelegatingHandler
{
public LoggingHttpClientHandler(HttpMessageHandler innerHandler) : base(innerHandler)
{
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Content != null)
{
Logging.Log.Info(await request.Content.ReadAsStringAsync());
}
return await base.SendAsync(request, cancellationToken);
}
}

有没有办法在不命名每个客户端的情况下做到这一点?

如果只是关于名称,则有一个扩展方法CreateClient,该方法不带任何参数并使用默认名称,即字符串。空。 因此,使用string.Empty作为名称注册服务可能会很好,例如:

services.AddHttpClient(string.Empty).AddHttpMessageHandler<LoggingHttpClientHandler>();

并使用以下方法实例化客户端:

var client = _clientFactory.CreateClient();

问题在于解析LoggingHttpClientHandler无用构造函数中的参数。 所以我删除了构造函数。

最新更新