C#通过httpwebrequest保持会话ID

我需要保留相同的会话ID,当使用C#.Net浏览网站的页面(像一个爬虫)。我发现了几个方法,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()

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

如果你创建一个单一的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()
http://stackoverflow.com/questions/1453560/c-sharp-keep-session-id-over-httpwebrequest

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:C#通过httpwebrequest保持会话ID