【问题标题】:C# keep session id over httpwebrequestC# 通过 httpwebrequest 保留会话 ID
【发布时间】:2010-11-30 00:39:24
【问题描述】:

在使用 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()

我的要求是提供更好的代码,或提供其他想法以更好地保存爬虫会话。

【问题讨论】:

标签: c# session cookies httpwebrequest


【解决方案1】:

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

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

你的代码变成:-

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

然后:-

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2014-11-08
    相关资源
    最近更新 更多