web-dev-qa-db-ja.com

C#httpwebrequestでセッションIDを保持する

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()

私の要求は、より良いコード、またはより良いクローラーセッションを維持するための追加のアイデアで貢献することです。

27
artcoding

単一のCookieコンテナーを作成し、それを最初のリクエストと2番目のリクエストの両方に割り当てる場合、応答からの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()
56
AnthonyWJones