无法使用 C# HttpClient 获取任何 cookie

Posted

技术标签:

【中文标题】无法使用 C# HttpClient 获取任何 cookie【英文标题】:Can't get any cookies with C# HttpClient 【发布时间】:2018-12-23 18:43:54 【问题描述】:

我正在尝试使用 C# 和 HttpClient 类在 Spotify 登录页面上获取 cookie。但是,当我知道正在设置 cookie 时,CookieContainer 始终为空。我没有发送任何标头,但它仍然应该给我 cookie,因为当我使用 python(请求模块)发送没有任何标头的 GET 请求时,我得到了 csrf 令牌。这是我的代码:

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Collections;
using System.Web;

class Program

    static void Main()
    
        Task t = new Task(MakeRequest);
        t.Start();
        Console.WriteLine("Getting cookies!");
        Console.ReadLine();
    

    static async void MakeRequest()
    
        CookieContainer cookies = new CookieContainer();
        HttpClientHandler handler = new HttpClientHandler();

        handler.CookieContainer = cookies;
        Uri uri = new Uri("https://accounts.spotify.com/en/login/?_locale=en-US&continue=https:%2F%2Fwww.spotify.com%2Fus%2Faccount%2Foverview%2F");
        HttpClient client = new HttpClient(handler);
        var response = await client.GetAsync(uri);
        string res = await response.Content.ReadAsStringAsync();
        Console.WriteLine(cookies.Count);
        foreach (var cookie in cookies.GetCookies(uri)) 
            Console.WriteLine(cookie.ToString());
        
    

对我来说这似乎很简单,但程序总是说有 0 个 cookie。有谁知道怎么回事?

【问题讨论】:

是什么让您认为有 cookie 被退回? @DavidG 我说我在 python 中测试了相同的程序,当我尝试获取 cookie 时,我得到了 csrf 令牌。 @CrispApples 您是否在处理程序handler.UseCookies 上启用了cookie? 这可能是骗子***.com/questions/14681144/… 我测试了您所拥有的并且可以重现该问题。但是,当我使用您列出的根域调用其他 URL 时,容器中会返回 cookie。 【参考方案1】:

您需要使用HttpClientHandler.UseCookies Property启用cookies

public bool UseCookies  get; set; 

获取或设置一个值,该值指示处理程序是否使用 CookieContainer 属性来存储服务器 cookie 并在发送请求时使用这些 cookie。

//...

CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;
handler.UseCookies = true; //<-- Enable the use of cookies.

//...

【讨论】:

刚试过,结果一样...没有返回cookie。你认为这是因为 HttpClient 没有在 Set-Cookie 响应头中考虑 cookie 吗?看看我的回答。 @CrispApples 我在https://spotify.com 进行了测试并取回了cookie。具有多个条目的相同 Set-Cookie 标头。您提供的原始 URL 的容器似乎为空 @CrispApples 我还在 spotify 域中使用多个 URL 对其进行了测试,即使存在 Set-Cookie 标头,cookie 容器对于任何使用 accounts.spotify.com 的调用都是空的 这很奇怪。我在spotify.com 上也收到了饼干。可能 account.spotify.com 的 Set-Cookie 标头格式不正确或其他什么?不管怎样,我会说这个问题已经解决了,因为我可以从 Set-Cookie 响应头中提取 csrf 令牌,即使 HttpClient 自己没有提取它。 即使启用 UseCookies 为 true,也没有收到 cookie【参考方案2】:

我尝试使用 Console.WriteLine(response.Headers) 将响应标头写入控制台,并将带有 csrf 令牌的 Set-Cookie 标头打印到控制台。所以看起来 HttpClient 并没有把这个 header 中的 cookie 算作实际的 cookie,因此没有将这些所说的 cookie 添加到 CookieContainer 中。

【讨论】:

我遇到了同样的问题,但使用不同的 URL,它确实检测到通过标头设置的 cookie。

以上是关于无法使用 C# HttpClient 获取任何 cookie的主要内容,如果未能解决你的问题,请参考以下文章

C# HTTPClient 不发送请求

如何使用 C# HttpClient PostAsync 显示上传进度

带有返回内容的 Task<string> 的 C# httpclient

C# 使用 HttpClient 从 JSON 响应中获取特定对象

在 c# (.net core) 中使用 httpclient 时无法建立 SSL 连接,但在 Postman 和 Browser 中有效

C# HttpClient 一个现有的连接被远程主机强行关闭