我必须如何为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。
有人知道如何做到这一点吗?