如何解决以正确的方式为 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 举报,一经查实,本站将立刻删除。