使用代码访问http资源,我们通常用WebRequest,当然,HttpClient提供了更方便的封装,我用得更多。只是碰到一些需要(cookie)鉴权的情况,需要把cookie伴随请求一起发到服务器,如下:

var m = new HttpClient(); var url = new Uri("http://localhost:4567/test"); var cookie = "mycookie=valueofcookie; expires=Thu, 14-Nov-2013 07:21:28 GMT; path=/; HttpOnly";

1,使用WebRequest,完全没问题:

var req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentLength = 0; req.Headers.Add("Cookie", cookie); var res = (HttpWebResponse)req.GetResponse(); using (var stream = res.GetResponseStream()) { if (stream != null) Console.WriteLine(new StreamReader(stream, System.Text.Encoding.UTF8).ReadToEnd()); }

2,如果要用HttpClient的话呢?我失败了两次:
我想这么写(2.1):


失败,于是这么写(2.2)
var req = new HttpRequestMessage(HttpMethod.Post, url); req.Headers.Add("Cookie", cookie); var t = await m.SendAsync(req); var c = await t.Content.ReadAsStringAsync(); Console.WriteLine(c);

仍然失败,查到这篇文章,有结论了,使用CookieContainer

此时有人提出,其实2.2的写法是可以的,之所以cookie没有传递到过去,是因为HttpClientHandler默认用了CookieContainer,所以会忽略掉Header里面的Cookie设置,因此你要做的就是把CookieContainer从HttpClientHandler里禁掉,测试通过:
var m = new HttpClient(new HttpClientHandler { UseCookies = false });
此时方法2.2一个字不要动,cookie顺利传递

相关文章:

  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-16
  • 2022-12-23
  • 2022-12-23
  • 2022-01-31
猜你喜欢
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案