代码之家  ›  专栏  ›  技术社区  ›  BlackMatrix

以正确的方式为HttpClient链接HttpMessageHandler

  •  0
  • BlackMatrix  · 技术社区  · 4 年前

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

    我使用SocketsHttpHandler作为支持cookie的HttpClient的内部HttpMessageHandler。在处理程序之上,我编写了自己的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是LoggingSocketShtPhandler,则可以记录此请求,但也应该与普通SocketShtPhandler一起使用。 在我看来,只要找到一个SocketsHttpHandler来获取CookieContainer,就在那些授权管理员的内部搜索似乎是不对的。例如,我可能想在将来写一本自己的。SocketsHttpHandler也是密封的。

    整个管道看起来像:

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

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

    有人知道如何做到这一点吗?

    0 回复  |  直到 4 年前