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顺利传递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值