HttpClient 不在 CookieContainer 中存储 cookie
Posted
技术标签:
【中文标题】HttpClient 不在 CookieContainer 中存储 cookie【英文标题】:HttpClient not storing cookies in CookieContainer 【发布时间】:2013-02-04 05:57:57 【问题描述】:我正在使用VS2010
+.NET 4.0
+ System.Net.Http
(来自Nuget
)。
由于我无法理解的原因,我在 HttpResponseMessage
中收到的会话 cookie 不会自动保存在 HttpClient CookieContainer
中。
这是我的代码的样子:
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);
Uri site = new Uri("https://www.mywebsite.com");
var response1 = client.SendAsync(new HttpRequestMessage(HttpMethod.Get,site)).Result;
我可以在响应标头中看到以下内容:
Set-Cookie: JSESSIONID=FC8110E434C2C6DAB78B4E335024A639; Path=/member; Secure
但是我的 cookie 容器仍然是空的……为什么?
【问题讨论】:
【参考方案1】:使用这段代码从响应中检索 cookie:
/// <summary>
/// Read web cookies
/// </summary>
public static CookieContainer ReadCookies(this HttpResponseMessage response)
var pageUri = response.RequestMessage.RequestUri;
var cookieContainer = new CookieContainer();
IEnumerable<string> cookies;
if (response.Headers.TryGetValues("set-cookie", out cookies))
foreach (var c in cookies)
cookieContainer.SetCookies(pageUri, c);
return cookieContainer;
【讨论】:
这只会设置第一个cookie。SetCookies(Uri, String)
方法只能调用一次,所有 cookie 值都用逗号分隔:***.com/questions/32956693/…【参考方案2】:
我猜问题在于您的 cookie 是安全。问题是,CookieContainer 不会在后续 HTTP 请求中将安全 cookie 发送回服务器。这可能是一个错误,或者背后有一些原因。
一种解决方法是手动将 cookie 重新添加到 CookieContainer。这样,cookie 将在 HTTP 请求标头中发送回,因为当您将 cookie 发送回服务器时,不会定义 secure。
更多信息请参见this article。
【讨论】:
感谢您的反馈和链接,赛义德!就我而言,我刚刚将我的 HttpClientHandler 重新配置为无 cookie(hander.UseCookies = false),因此只需将 session-id cookie 作为 URL 参数发送到 Web 服务器) @user2038596 - 安全 cookie 仅通过 HTTPS 等安全通道发送。详情请见RFC6265 §4.1.2.5。 即使 cookie 不安全,我也遇到了这个问题,我也排除了导致这种行为的 HttpOnly 属性。将它添加回集合中也适用于我的情况。【参考方案3】:也许问题在于您的请求 Url 路径指向网站的根目录(“/”),但您的 Set-Cookie 标头指示的路径为“/member”。
【讨论】:
【参考方案4】:由于路径的大小写差异,我遇到了 cookie 问题。我登录到 /mysite/login,并为 mysite 设置了 cookie,但随后重定向到 /MySite,HttpClient 突然丢弃了所有 cookie!当我将地址更改为 /MySite/login 时一切正常。
【讨论】:
以上是关于HttpClient 不在 CookieContainer 中存储 cookie的主要内容,如果未能解决你的问题,请参考以下文章
apache HttpClient关于digest的一个大坑