博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpClient传递Cookie
阅读量:6881 次
发布时间:2019-06-27

本文共 1917 字,大约阅读时间需要 6 分钟。

使用代码访问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):

m.DefaultRequestHeaders.Add("Cookie", cookie);var t = await m.PostAsync(url, null);var c = await t.Content.ReadAsStringAsync();Console.WriteLine(c);
失败,于是这么写(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
var baseAddress = new Uri("http://example.com");var cookieContainer = new CookieContainer();using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })using (var client = new HttpClient(handler) { BaseAddress = baseAddress }){    //此处是顺便演示如何传Post参数    var content = new FormUrlEncodedContent(new[]    {        new KeyValuePair
("foo", "bar"), new KeyValuePair
("baz", "bazinga"), }); cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value")); var result = client.PostAsync("/test", content).Result; result.EnsureSuccessStatusCode();}
此时有人提出,其实2.2的写法是可以的,之所以cookie没有传递到过去,是因为HttpClientHandler默认用了CookieContainer,所以会忽略掉Header里面的Cookie设置,因此你要做的就是把CookieContainer从HttpClientHandler里禁掉,测试通过:
var m = new HttpClient(new HttpClientHandler { UseCookies = false });
此时方法2.2一个字不要动,cookie顺利传递

转载地址:http://khjbl.baihongyu.com/

你可能感兴趣的文章
Xhprof安装
查看>>
所谓的linux集群-其实可以so easy
查看>>
关于OOM-killer
查看>>
Wireshark网络抓包(一)——数据包、着色规则和提示
查看>>
GOP/ 码流 /码率 / 比特率 / 帧速率 / 分辨率
查看>>
学习一门编程语言的各种矛盾
查看>>
sqlmap简单使用笔记
查看>>
Eclipse ME 安装详解(Windows XP)
查看>>
IE8及以下不支持trim()的处理方法
查看>>
centos反编译APK包
查看>>
python 位操作符 左移和右移 运算
查看>>
预备作业①
查看>>
跨域 - jsonp轻松搞定跨域请求
查看>>
css布局 - 工作中常见的两栏布局案例及分析
查看>>
个人代码库のC#背景色渐变的功能
查看>>
基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境
查看>>
承接上面一遍的(后续步骤)
查看>>
杂笔感想
查看>>
Source Insight 常用设置
查看>>
android anr什么意思?
查看>>