首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在.net 4.5中,尝试使用HttpClient使cookie退出响应时遇到困难

在.net 4.5中,尝试使用HttpClient使cookie退出响应时遇到困难
EN

Stack Overflow用户
提问于 2012-11-10 08:48:17
回答 4查看 90K关注 0票数 118

我已经获得了以下成功运行的代码。我不知道如何从响应中取出cookie。我的目标是能够在请求中设置cookie,并从响应中获取cookie。有什么想法?

代码语言:javascript
复制
private async Task<string> Login(string username, string password)
{
    try
    {
        string url = "http://app.agelessemail.com/account/login/";
        Uri address = new Uri(url);
        var postData = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("username", username),
            new KeyValuePair<string, string>("password ", password)
        };

        HttpContent content = new FormUrlEncodedContent(postData);
        var cookieJar = new CookieContainer();
        var handler = new HttpClientHandler
        {
            CookieContainer = cookieJar,
            UseCookies = true,
            UseDefaultCredentials = false
        };

        var client = new HttpClient(handler)
        {
            BaseAddress = address
        };


        HttpResponseMessage response = await client.PostAsync(url,content);
        response.EnsureSuccessStatusCode();
        string body = await response.Content.ReadAsStringAsync();
        return body;
    }
    catch (Exception e)
    {
        return e.ToString();
    }
}

以下是完整的答案:

代码语言:javascript
复制
HttpResponseMessage response = await client.PostAsync(url,content);
response.EnsureSuccessStatusCode();

Uri uri = new Uri(UrlBase);
var responseCookies = cookieJar.GetCookies(uri);
foreach (Cookie cookie in responseCookies)
{
    string cookieName = cookie.Name;
    string cookieValue = cookie.Value;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-10 09:05:20

要向请求添加cookie,请在请求之前使用CookieContainer.Add(uri, cookie)填充cookie容器。发出请求后,cookie容器将自动填充来自响应的所有cookie。然后,您可以调用GetCookies()来检索它们。

代码语言:javascript
复制
CookieContainer cookies = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler();
handler.CookieContainer = cookies;

HttpClient client = new HttpClient(handler);
HttpResponseMessage response = client.GetAsync("http://google.com").Result;

Uri uri = new Uri("http://google.com");
IEnumerable<Cookie> responseCookies = cookies.GetCookies(uri).Cast<Cookie>();
foreach (Cookie cookie in responseCookies)
    Console.WriteLine(cookie.Name + ": " + cookie.Value);

Console.ReadLine();
票数 198
EN

Stack Overflow用户

发布于 2019-11-20 14:16:55

如果你不能访问HttpClient并且不能注入CookieContainer,还有另一种选择。这在.NET核心2.2中有效:

代码语言:javascript
复制
private string GetCookie(HttpResponseMessage message)
{
    message.Headers.TryGetValues("Set-Cookie", out var setCookie);
    var setCookieString = setCookie.Single();
    var cookieTokens = setCookieString.Split(';');
    var firstCookie = cookieTokens.FirstOrDefault();
    var keyValueTokens = firstCookie.Split('=');
    var valueString = keyValueTokens[1];
    var cookieValue = HttpUtility.UrlDecode(valueString);
    return cookieValue;
}
票数 14
EN

Stack Overflow用户

发布于 2018-08-10 20:55:50

您可以使用给定的URL轻松获取Cookie值。

代码语言:javascript
复制
private async Task<string> GetCookieValue(string url, string cookieName)
{
    var cookieContainer = new CookieContainer();
    var uri = new Uri(url);
    using (var httpClientHandler = new HttpClientHandler
    {
        CookieContainer = cookieContainer
    })
    {
        using (var httpClient = new HttpClient(httpClientHandler))
        {
            await httpClient.GetAsync(uri);
            var cookie = cookieContainer.GetCookies(uri).Cast<Cookie>().FirstOrDefault(x => x.Name == cookieName);
            return cookie?.Value;
        }
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13318102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档