c# - 池化的 HttpClient 实例是否保留 CookieContainer?
问题描述
此答案显示如何将 cookie 添加到 HttpClient 请求。但是其中一条评论警告说CookieContainer
缓存在 HttpClient 上。我的大部分 cookie 不应再次发送给其他用户。
我希望HttpClientFactory
清除CookieContainer
它的池中的 HttpClient 实例之类的东西。
如果我HttpClient
通过电话得到我的,我得到的httpClientFactory.CreateClient
是否有可能有一个以前CookieContainer
的?
更新:
我的问题的答案是肯定的! CookieContainer
适用于您希望在每次通话中发送相同的 cookie 时。
如果您需要在每次调用时发送不同的 cookie,有几种方法可以做到这一点。但最简单的是将它放在标题中。
因为客户端的每个请求HttpClientFactory
都会创建一个新HttpClient
的,所以您可以添加到客户端的标头中,而不必担心它会重用 cookie。
这样做的关键是设置UseCookies
。它必须设置为 false,否则您添加到标头的 cookie 将被忽略。完成此操作后,您可以将 cookie 添加到“Cookies”键下的标题中,并将它们作为分号分隔的键值对输入(它们之间使用等号)。您的 cookie 在标题“Set-Cookies”中返回。
解决方案
这HttpMessageHandler
是被汇集的实例;不是HttpClient
实例。默认情况下,处理程序的生命周期为 2 分钟,这意味着a很可能会在多个sCookieContainer
之间共享。HttpClient
官方文档中有一个部分,它解释了自动 cookie 处理和IHttpClientFactory
不能很好地协同工作:
池化的
HttpMessageHandler
实例导致CookieContainer
对象被共享。意外CookieContainer
的对象共享通常会导致错误的代码。对于需要 cookie 的应用程序,请考虑:
- 禁用自动 cookie 处理
- 避免
IHttpClientFactory
调用ConfigurePrimaryHttpMessageHandler以禁用自动 cookie 处理:
services.AddHttpClient("configured-disable-automatic-cookies") .ConfigurePrimaryHttpMessageHandler(() => { return new SocketsHttpHandler() { UseCookies = false, }; });
推荐阅读
- javascript - 将功能部署到 Firebase 时出错
- c# - Entity Framework Linq foreach 性能与使用 Select() 代替
- cakephp - 404 Not Found 禁用 CakePHP 的 error.log?
- java - 是在 Class Constant Pool、String Pool 还是 Young Generation 中分配字符串文字的空间?GC 何时可以访问字符串文字?
- java - 如何使用谓词过滤多个不继承同一个接口的POJO
- .htaccess - .htaccess 重写导致 index.php 不起作用
- c# - 获取 textBlock 的高度时,无论实际高度如何,它都会显示相同的数字
- arrays - 我如何找到两张牌的总和?
- node.js - 监控和刷新 PubSub 批处理发布者队列
- go - Is it safe to write files in mode os.O_APPEND|os.O_WRONLY?