C#HttpClient-如果UseCookies在请求头中设置为false,是否可以从响应中获取cookie



我知道您可以通过在请求处理程序中添加CookieContainer来获取cookie。

然而,除非我将UseCookies设置为false,否则以下发布请求将失败:

static CookieContainer cookies = new CookieContainer();    
var clientHandler = new HttpClientHandler
{
//Original Apporach - this fails the POST request 
// UseCookies = true,
// CookieContainer = cookies,
//I had to do this
UseCookies = false,
};
var client = new HttpClient(clientHandler);
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("*redacted*"),
Headers =
{
{ "cookie", "SampleCookie" },
},
Content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "Provider", "Email" },
{ "Code", "12345" },
{ "RememberMe", "False" },
{ "RememberBrowser", "false" },
{ "__RequestVerificationToken", "SampleToken" },
}),
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}

老实说,对HTTP请求不是很了解。我原来的方法失败是因为我手动设置cookie吗?

请求失败的原因可能取决于许多因素,如身份验证和所需的其他标头,如果不知道您试图访问的内容的细节,很难判断是什么原因导致的。这里有一个简单的例子,展示了如何向谷歌主页发出请求,并将所有cookie放入容器中,然后在控制台应用程序中打印出来:

static void Main(string[] args)
{
var uri = new Uri("https://google.com");
var cookies = new CookieContainer();
var handler = new HttpClientHandler();
handler.CookieContainer = cookies;
using (var client = new HttpClient(handler))
{
var result = client.GetAsync(uri).Result;
}
foreach (Cookie cookie in cookies.GetCookies(uri))
{
var print = $"cookie name: {cookie.Name}ncookie value: {cookie.Value}n";
Console.WriteLine(print);
}
}

许多人仍然建议UseCookies = false发送/覆盖自定义cookie,这是错误的。

UseCookies = false是禁用请求/响应cookie容器,我知道如果我这样做,我可以发送自定义标头Cookie,但缺点是我无法读取cookie容器内的Response Cookie,甚至无法读取响应标头。

覆盖此项的正确方法是在CookieContainer中设置cookie

CookieContainer cookies = new CookieContainer();
// add your custom cookie here
Cookie customCookie = new Cookie("cookieKey", "cookieValue" "/", "example.com");
cookies.Add(customCookie);
var clientHandler = new HttpClientHandler
{
CookieContainer = cookies,
//UseCookies = false, // no need this
};
// no need to write
// Headers = { { "cookie", "cookieKey=cookieValue" } }

最新更新