2009-06-28 54 views
24

我想創建一個ASP.NET網站的HttpWebRequest/HttpWebResponse會話,以便稍後通過url參數解析HTML表單(這部分我知道怎麼做),但我不明白如何解析和設置cookie,如會話ID。在Fiddler中,它顯示ASP.NET會話ID是通過Set-Cookie在對URL的/路徑的請求的響應中返回的,但是如何解壓縮此會話ID並將其設置爲下一個HttpWebRequest的Cookie ?我知道這個Set-Cookie頭可以在HttpWebResponse.Headers.Keys中找到,但是有沒有解析它的直接路徑?謝謝!如何解析HttpWebResponse.Headers.Keys的Set-Cookie會話ID返回

+1

不客氣! – 2009-06-30 00:40:56

回答

54

.NET框架將爲您管理cookie。您不必關心解析標頭中的Cookie信息或將Cookie標頭添加到您的請求中。

要存儲和發送您的會話ID,請使用CookieCookieContainer類來存儲它們,然後確保您發送每個請求的Cookie。

以下示例顯示如何執行此操作。 CookieContainer,'cookieJar'可以跨多個域和請求共享。一旦將它添加到請求對象中,在返回響應時,對它的引用也將被添加到響應對象中。

CookieContainer cookieJar = new CookieContainer(); 

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com"); 
request.CookieContainer = cookieJar; 

var response = request.GetResponse(); 

foreach (Cookie c in cookieJar.GetCookies(request.RequestUri)) 
{ 
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value); 
} 

這段代碼的輸出將是:

Cookie['PREF']: ID=59e9a22a8cac2435:TM=1246226400:LM=1246226400:S=tvWTnbBhK4N7Tlpu

+0

非常感謝你!這真的會幫助我!好極了! :) – 2009-06-28 22:49:14

+0

我實現了這一點,它的工作原理!非常感謝。 – 2009-06-29 22:25:43

+0

+1非常感謝幫助!我並不期待手動解析HTTP標頭:) – jv42 2011-09-29 09:45:39

7

從丹·赫伯特的回答讓我真的。我感謝您的幫助。

只是想發佈我的用法 - 希望它在某個時間點幫助某人。我的要求是我需要從第一個http post post發送cookies到第二個http post請求。

1:

CookieContainer cookieJar = new CookieContainer(); 
request.CookieContainer = cookieJar; 
.... 

CookieCollection setCookies = cookieJar.GetCookies(request.RequestUri); 

第二:

CookieContainer cc = new CookieContainer(); 
cc.Add(setCookies);  
request.CookieContainer = cc; 
1

哼我可能是錯的,但是從我所從第一反應觀察最近

餅乾,不包括'在302(重定向)狀態的情況下,將cookie設置爲標頭中出現的cookie(例如某些會話ID ...)

如果autofollowredirect設置爲true,則設置的cookie將被處理,並且隨後的請求會自動完成,將包含由第一次調用時由set cookie定義的cookie

如果autofollowredirect設置爲false,則第一個請求沒有得到由設置的cookie定位的cookie,我猜這也是我的queston,如果有人知道,那麼隨後在下一個請求中擁有這些cookie的唯一方法是解析設置的cookie?

5

我有同樣的問題(亞馬遜) 我用下面的正則表達式:

string regexp = "(?<name>[^=]+)=(?<val>[^;]+)[^,]+,?";);
MatchCollection myMatchCollection = Regex.Matches(cookiesStr, regexp);
foreach (Match myMatch in myMatchCollection)
{
string cookieName = myMatch.Groups["name"].ToString();
string cookieVal = myMatch.Groups["val"].ToString();
Cookie cookie = new Cookie(cookieName, cookieVal);
cookies.Add(cookie);
}

請注意,我只關心cookie的名稱/值...

好運 埃利亞