【问题标题】:HttpClient with Mutual TLS and DelegatingHandler for logging request/response throws exception用于记录请求/响应的具有相互 TLS 和 DelegatingHandler 的 HttpClient 引发异常
【发布时间】:2016-03-11 12:35:25
【问题描述】:

我想用LoggingHandler : DelegatingHandler 记录HttpClient 的请求和响应,但我收到错误A task was canceledHttpClient 通过 TLS 连接。

var httpClient = new HttpClient(MutualTlsHandler());

private WebRequestHandler MutualTlsHandler()
{
    var certificateCollection = new X509Certificate2Collection { ClientConfiguration.Certificate };
    var mutualTlsHandler = new WebRequestHandler();

    mutualTlsHandler.ClientCertificates.AddRange(certificateCollection);
    mutualTlsHandler.ServerCertificateValidationCallback = IsValidServerCertificate;

    return mutualTlsHandler;
}

这就像一个魅力,但我想记录正在发送的请求。尝试创建 LoggingHandler 并将其添加到链中会导致错误 A task was canceled

var httpClient = new HttpClient(new LoggingHandler(MutualTlsHandler())

internal class LoggingHandler : DelegatingHandler
{
    public LoggingHandler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        var content = request.Content.ReadAsStringAsync();

        return await base.SendAsync(request, cancellationToken);
    } 
}

我认为使用request.Content.ReadAsStringAsync() 读取会导致需要倒带的流,但是如何实现呢?使用Content.CopyToAsync 复制会导致相同的错误。

感谢所有帮助。

【问题讨论】:

    标签: c# dotnet-httpclient


    【解决方案1】:

    您是否尝试在此 nuget 包中使用 HttpClientFactoryhttps://www.nuget.org/packages/Microsoft.AspNet.WebApi.Client/

    添加后我认为您可以这样做:

    HttpClientFactory.Create(mutualTlsHandler, loggingHandler);
    

    【讨论】:

    • 不幸的是,这给出了相同的结果。令人困惑的是,可能有多个DelegatingHandlers 在读取内容的链中,但是一旦引入WebRequestHandler,它就会失败。
    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    相关资源
    最近更新 更多