2009-09-21 355 views
26

C#.Net(クローラのような)を使ってサイトのページをナビゲートするとき、同じセッションIDを保持する必要があります。重要な情報がヘッダーに表示されているので(表示されていない)、HTTPブラウザーが送信していたもの(HTTP要求)とWebサーバー(HTTP応答)から受信したものを比較するのに、ブラウザによって)。 サーバからブラウザに公開されているセッションIDとサーバコード(PHPなど)にプライベートなサーバのセッション変数を混同しないようにしてください。C#セッションIDをhttpwebrequestで保持する

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

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

+0

あなたのコードをフォーマットするために努力をしてください。 http://stackoverflow.com/editing-help – spender

答えて

54

1つのCookieコンテナを作成し、それを最初のリクエストと2番目のリクエストの両方に割り当てる場合、レスポンスからクッキーをコピーすることについてすべてを行う必要はありません。

レスポンスによってクッキーが設定されると、リクエストに添付されたクッキーコンテナは、それらのクッキーを受信して​​保存します。したがって、一連のリクエスト間で同じセッションコンテキストを維持するには、単一の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() 
+1

あなたは日の仲間を救います、ありがとう – vbtheory

関連する問題