【问题标题】:Windows.Web.Http.HttpClient: Receiving cookies and save themWindows.Web.Http.HttpClient:接收 cookie 并保存它们
【发布时间】:2016-02-01 16:38:00
【问题描述】:

我需要一些关于新 Windows.Web.Http.HttpClient 类的帮助。我现在正在编写我的第一个 WP8.1 应用程序,它让我发疯。我正在登录这样的网站:

var values = new Dictionary<string, string>();
values.Add("login_username", _username);
values.Add("login_password", _password);
values.Add("login_lifetime", "36000");

var parameters = new HttpFormUrlEncodedContent(values);
var response = await Forum.Http.PostAsync(new Uri("http://foo.bar.xyz"), parameters);

var buffer = await response.Content.ReadAsBufferAsync();
byte[] byteArray = buffer.ToArray();
string content = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);

if (content.Contains("Wrong password/user name"))
{
        return false;
}

return true;

这很好用。我的 HttpClient 是一个静态字段,像这样:

public static HttpBaseProtocolFilter Filter = new HttpBaseProtocolFilter();
public static HttpClient Http = new HttpClient(Filter);

登录工作正常,但它不会保存网站在登录后发送的 cookie。如何保存它们,我可以在每次 GetAsync() 时将它们发送到网站吗?

【问题讨论】:

    标签: c# .net cookies windows-runtime httpclient


    【解决方案1】:

    您可以使用 HttpClientHandler 代替 HttpBaseProtocolFilter。如果您必须使用 HttpBaseProtocolFilter,那么有一个 HttpCookieManager 类型的只读 CookieManager 属性可以帮助您。

    这是一个使用 HttpClientHandler 的示例:

    public static CookieContainer Cookies = new CookieContainer();
    public static HttpClientHandler HttpClientHandler = new HttpClientHandler() { CookieContainer = Cookies };
    public static HttpClient Http = new HttpClient(HttpClientHandler);
    

    在您的 PostAsync() 调用返回后,您可以提取 cookie

    var uri = new Uri("http://foo.bar.xyz");
    var response = await Forum.Http.PostAsync(uri, parameters);
    IEnumerable<Cookie> responseCookies = Cookies.GetCookies(uri).Cast<Cookie>();
    foreach (Cookie cookie in responseCookies) {
        Console.WriteLine(cookie.Name + ": " + cookie.Value);
    }
    

    如果您想重新使用初始请求中的 cookie,您可以创建自己的 CookieContainer 并从响应 cookie 中复制 cookie。或者 - 你也可以像这样添加一个硬编码的 cookie:

    Cookies.Add(new HttpCookie("Name", "Value") { Domain="http://foo.bar.xyz" });
    

    【讨论】:

    • 据我所知 Windows.Web.Http.HttpClient 不使用 HttpClientHandler。我错了吗?
    • 我实现了您的解决方案(必须改用 System.Net.Http.HttpClient)。一切仍然正常。但它不会接收或保存任何 cookie。我的 CookieContainer 仍然是空的。这真的让我发疯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2020-04-23
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多