HttpClient传递Cookie
使用代码访问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<string, string>("foo", "bar"),
        new KeyValuePair<string, string>("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顺利传递
HttpClient传递Cookie的更多相关文章
- 使用curl传递cookie错误的问题
		工作中发现一个问题, 通过curl调用接口传递cookie操作用户的数据, 接口的程序解析不了cookie中的数据. 经过排查发现curl发送的cookie数据为 TZ+Gn+rEk+6G4d 而接口 ... 
- Java通过httpclient获取cookie模拟登录
		package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ... 
- node下的跨域传递cookie
		研究背景: 最近有一位朋友找工作,需要面试,涉及到面试就涉及面试题,于是我想起来鄙人之前面试被问到的一个跨域传递cookie的问题.搜索了相关资料,但自己不敲一下肯定是不足以让人信服的. 我用node ... 
- Jmeter中传递cookie值
		场景:用户登陆后会本地会保存cookie,cookie是用来跟服务端验证此用户已经登陆过的重要信息,但是如何获取并在其他请求时将此cookie传递给服务器呢? 在线程组下面之直接添加HTTP Cook ... 
- 如何从桌面程序向浏览器传递cookie或自定义header
		类似问题 从c#程序启动ie并传递cookie 打开默认浏览器并传递cookie 打开一个web浏览器使用c#应用程序并添加请求头 猜想 从wpf程序打开默认浏览器并定位到一个url ,并且向这个ur ... 
- Jmeter跨线程组传递cookie,以禅道系统为例;BeanShell的存取数据的使用
		先看下脚本结构: 思路:将登陆请求放在setUp Thread Group中:把登陆后的cookie通过正则提取出来,然后存为全局变量,传递到下一个线程组中: 第一步:添加setUp Thread G ... 
- chap4-关联接口测试-通过全局变量传递cookie
		# 1 http_request.py import requests class HttpRequest: def http_request(self, url, method, data=None ... 
- requests接口自动化9-共享session和传递cookie
		前言: session:用requests.session()创建会话,可以将会话信息传递给其他接口 cookie:用RequestsCookieJar或者cookie字典传递cookie信息 fil ... 
- Postman设置自动捕获传递Cookie教程
		目录 前言 一.安装 1.Postman安装Install Interceptor Bridge 2.谷歌浏览器安装扩展Postman Interceptor 二.使用 1. 打开Capture Co ... 
随机推荐
- 在ISE查看各个模块消耗的资源
			这个是很多兄弟姐妹非常想知道的事情.我今天就简单和大家详细说一说.其实很简单,只是大家可能没有注意而已.把图上的-detail选定即可. 转载自:http://bbs.21ic.com/blog-73 ... 
- [转]如何使用Fiddler抓取指定浏览器的数据包
			参考资料:https://www.cnblogs.com/lauren1003/p/6519630.html 使用fiddler抓取不到浏览器的包时常用的解决办法: 1.必须先打开Fiddler,再打 ... 
- 每日英语:Mooncake Austerity Hits China's Mid-Autumn Festival
			First baijiu, then red carpets, and now mooncakes. For Chinese government officials, the list of tab ... 
- 【Maven学习】Maven打包生成包含所有依赖的jar包
			http://blog.csdn.net/u013177446/article/details/54134583 ******************************************* ... 
- Linux中查看CPU信息【转】
			[转自]:http://blog.chinaunix.net/uid-23622436-id-3311579.html cat /proc/cpuinfo中的信息 processor 逻辑 ... 
- 几种任务调度的 Java 实现方法与比较   mark
			任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工 ... 
- python学习笔记(14)--爬虫下载漫画图片修改版
			说明: 1. 2017.3.12,周六从中午吃完包子12点多折腾了一下午加一个晚上,试了4个网站的爬虫,发现都不能下载!甚至前几天测试能下载的都不能用了! 2. 到晚上发现煎蛋网的可以用了,立即试了下 ... 
- wp中的动画
			动画目标:必须是依赖属性.可以用于Double,Color,Point,Object类型.对应的动画类后面加Animation,下面代码演示旋转360°. <Button Content=&qu ... 
- buildroot  搭建ftpd 服务器记录
			vsftpd 搭建失败,应该是buildroot 文件系统还有操作没有理解透,还需要不断的学习. 所以用轻量级的 ftpd 进行替代, 步骤如下: // ---> make busybox-me ... 
- mysql 函数模拟序列
			mysql本身不提供序列机制,但是可以通过函数来模拟实现序列 CREATE TABLE IF NOT EXISTS `sequence` ( `id` ) CHARACTER SET utf8 COL ... 
