【问题标题】:HttpClient not storing cookies in CookieContainerHttpClient 不在 CookieContainer 中存储 cookie
【发布时间】: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 容器仍然是空的……为什么?

【问题讨论】:

    标签: c# cookies httpclient


    【解决方案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;
    }
    

    【讨论】:

    【解决方案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 时一切正常。

      【讨论】:

        猜你喜欢
        • 2013-07-02
        • 2011-04-09
        • 1970-01-01
        • 2012-07-05
        • 2015-08-17
        • 2019-01-09
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多