C#如何通过HttpWebRequest保持会话ID

27

我需要使用C#.Net在网站页面之间导航时保留相同的会话ID(就像爬虫一样)。我找到了几种方法,其中一个HTTP嗅探器非常有用,可以比较我的IE浏览器发送的内容(HTTP请求)和从Web服务器接收的内容(HTTP响应),因为重要信息在标头中(这些标头不是由浏览器显示的)。 请不要混淆服务器发送给浏览器的公共会话ID和服务器代码(如PHP)中私有的会话变量。

WebHeaderCollection headerCollection = new WebHeaderCollection();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
  /* save headers */
  for (int i = 0; i < response.Headers.Count; i++)
  {
     headerCollection.Add(response.Headers.AllKeys[i], response.Headers.Get(i));
  }
  /* save cookies */
  cookieContainer = new CookieContainer();
  foreach (Cookie cookie in response.Cookies)
  {
    cookieContainer.Add(cookie);
  }
}

为了发起其他的 GET 或 POST 请求:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
...
/* restore PHPSESSID */
for (int i = 0; i < headerCollection.Count; i++)
{
 string key = headerCollection.GetKey(i);
 if (key == "Set-Cookie")
 {
  key = "Cookie";
 }
 else
 {
  continue;
 }
 string value = headerCollection.Get(i);
 request.Headers.Add(key, value);
}
/* restore cookies */
request.CookieContainer = cookieContainer;
/* complete request */
Stream writeStream = request.GetRequestStream()

我的请求是为了贡献更好的代码或者额外的想法来实现更好的爬虫会话保留。


请注意格式化您的代码。参考网址:http://stackoverflow.com/editing-help - spender
1个回答

56

如果您创建一个单一的cookie容器,并将其分配给您的第一个和第二个请求,您就不需要复制响应中的所有cookie。

当响应设置cookie时,附加到请求的cookie容器会接收并存储这些cookie。因此,为了在一系列请求之间维护相同的会话上下文,只需维护一个单一的cookie容器实例,并将其与所有请求一起使用。

您的代码变为:

cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
  // Do stuff with response
}

then:-

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
...

request.CookieContainer = cookieContainer;
Stream writeStream = request.GetRequestStream()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接