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的主要内容,如果未能解决你的问题,请参考以下文章

接口测试“八重天”---HttpClient

apache HttpClient关于digest的一个大坑

httpclient 在公司代理中无法从 .net6 工作

论httpclient上传带参数commons-httpclient和apache httpclient区别

HttpClient

轻松把玩HttpClient之封装HttpClient工具类,插件式配置HttpClient对象