我让我的程序(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,包含正确的信息。提前谢谢。
答案 0 :(得分:3)
您需要为自己的网络请求分配CookieContainer
,并对以下请求使用同样的CookieContainer
。
您可以(如果您想在关闭申请时保留Cookie)从CookieContainer
获取Cookie列表并序列化这些Cookie。打开应用程序后,您可以反序列化并重建CookieContainer
。
答案 1 :(得分:1)
根据您提供的评论,我会冒险猜测您并未正确将登录Cookie添加到下一个WebRequest
。使用WebRequest
对象进行Cookie处理有点困难,因此我建议使用内置Cookie解析的HttpWebRequest
和HttpWebResponse
。您只需要在这里和那里更改几行代码:
制作请求(在您的问题中使用相同的示例)
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
}
希望这会让你走上正轨:)