微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以正确的方式为 HttpClient 链接 HttpMessageHandler

如何解决以正确的方式为 HttpClient 链接 HttpMessageHandler

我必须如何为 HttpClient 链接我的 HttpMessageHandlers 以达到我的以下目标。

我使用 SocketsHttpHandler 作为 HttpClient 的内部 HttpMessageHandler 并支持 cookie。在处理程序之上,我编写了自己的 LoggingHttpHandler 来记录每个请求,包括 cookie。 cookie 不存在于 HttpRequestMessage 和 HttpResponseMessage 中。它们由 SocketsHttpHandler 的内部 CookieContainer 处理,因此我在 LoggingSocketsHttpHandler 中访问这些 cookie。

我的解决方案是这样的:

    public class LoggingSocketsHttpHandler : DelegatingHandler
    {       
        private readonly SocketsHttpHandler _httpHandler;           
        
        public LoggingSocketsHttpHandler(SocketsHttpHandler httpHandler)
            : base(httpHandler)
        {
             _httpHandler = httpHandler;                      
        }

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
        {
            LogRequestStart(request); // Access SocketsHttpHandler.CookieContainer

            var response = await base.SendAsync(request,cancellationToken).ConfigureAwait(false);

            LogRequestEnd(response); // Access SocketsHttpHandler.CookieContainer
        }

    }

效果很好。我的问题是现在。我正在编写另一个 HttpMessageHandler 如果检测到特殊的 HTTP 状态代码,它会拦截响应。发生这种情况时,HttpMessageInterceptionHandler 也需要访问 CookieContainer 并发出另一个请求。如果 InnerHandler 是 LoggingSocketsHttpHandler 但也应该与普通的 SocketsHttpHandler 一起使用,则可以记录此请求。 只要找到 SocketsHttpHandler 来获取 CookieContainer,就在这些 DelegatingHandlers 内部搜索对我来说似乎是错误的。例如,我可能想在将来自己编写一个。 SocketsHttpHandler 也是密封的。

完整的管道如下所示:

HttpMessageInterceptionHandler (1) -> LoggingSocketsHttpHandler (2) -> SocketsHttpHandler

其中 (1) 和 (2) 需要访问 CookieContainer。

有人知道如何实现吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。