2

我让我的程序(c#)登录到网站,我得到了正确的缓冲 cookie 信息。然而,当我想检索登录后的正确数据时,我得到一个 401,会话超时。

所以我想,该网站一定无法检索该 cookie 信息。无法弄清楚如何存储它以便网站可以检索它。

        WebRequest req = WebRequest.Create(Url);
        req.ContentType = "application/x-www-form-urlencoded";
        req.Method = "POST";
        byte[] bytes = Encoding.ASCII.GetBytes(Gegevens);
        req.ContentLength = bytes.Length;
        using (Stream os = req.GetRequestStream())
        {
        os.Write(bytes, 0, bytes.Length);
        }
        WebResponse resp = req.GetResponse();
        cookieHeader = resp.Headers["Set-cookie"];

cookieHeader,包含正确的信息。提前致谢。

4

2 回答 2

3

您需要将 a 分配CookieContainer给您的 Web 请求,并将其CookieContainer用于以下请求。

请参阅MSDN 以供参考

您可以(如果您想在关闭应用程序时保留 cookie)从中获取 Cookie 列表CookieContainer并对其进行序列化。打开应用程序后,您可以反序列化并重建CookieContainer.

于 2012-11-27T15:24:19.660 回答
1

根据您提供的评论,我将冒险猜测并说您没有正确地将登录 cookie 添加到您的下一个WebRequest. 使用对象处理 CookieWebRequest有点困难,因此我建议使用HttpWebRequest内置HttpWebResponsecookie 解析的 cookie。您只需在这里和那里更改几行代码:

构建请求(在您的问题中使用相同的示例)

CookieContainer cookies = new CookieContainer();

// When using HttpWebRequest or HttpWebResponse, you need to cast for it to work properly
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.CookieContainer = cookies;
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";

byte[] bytes = Encoding.ASCII.GetBytes(Gegevens);
req.ContentLength = bytes.Length;
using (Stream os = req.GetRequestStream())
{
    os.Write(bytes, 0, bytes.Length);
}

// Cast here as well
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
    // Code related to the web response goes in here
}

现在,您的 cookie 信息保存在CookieContainer对象中。稍后可以在您的代码中重复使用它来验证您的登录。如果不需要,则无需将此 cookie 信息写入磁盘。

使用 cookie 信息构建请求 (与上面几乎相同,但您没有添加 POST 数据,而是使用 GET 请求)

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.CookieContainer = cookies; // This is where you add your login cookies to the current request
req.Method = "GET";

using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
    // Code related to the web response goes here
}

希望这会让你走上正确的轨道:)

于 2012-11-27T15:33:53.243 回答