2009-06-28 22 views
24

Tôi đang cố gắng tạo một phiên HttpWebRequest/HttpWebResponse với một trang web ASP.NET để phân tích cú pháp mẫu HTML thông qua các tham số url (phần này tôi biết cách làm), nhưng tôi không hiểu cách phân tích cú pháp và đặt cookie như id phiên. Trong Fiddler, nó cho thấy ASP.NET Session ID được trả về thông qua Set-Cookie trong phản hồi yêu cầu đến/path của url, nhưng làm thế nào tôi có thể trích xuất id phiên này và đặt nó làm cookie cho HttpWebRequest tiếp theo ? Tôi hiểu rằng tiêu đề Set-Cookie này sẽ được tìm thấy trong HttpWebResponse.Headers.Keys, nhưng có một đường dẫn trực tiếp để phân tích nó không? Cảm ơn!Làm thế nào để phân tích cú pháp HttpWebResponse.Headers.Keys cho một id phiên Set-Cookie trả về

+1

Bạn được chào đón! –

Trả lời

54

Khuôn khổ .NET sẽ quản lý cookie cho bạn. Bạn không phải lo lắng về việc phân tích thông tin cookie ra khỏi tiêu đề hoặc thêm tiêu đề cookie vào yêu cầu của mình.

Để lưu trữ và gửi ID phiên, hãy sử dụng các lớp học CookieCookieContainer để lưu trữ chúng và sau đó đảm bảo bạn gửi cookie theo mọi yêu cầu.

Ví dụ sau cho biết cách thực hiện việc này. CookieContainer, 'cookieJar' có thể được chia sẻ trên nhiều tên miền và yêu cầu. Khi bạn thêm nó vào một đối tượng yêu cầu, tham chiếu đến nó cũng sẽ được thêm vào đối tượng phản hồi khi đáp ứng được trả về.

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); 
} 

Kết quả của đoạn mã này sẽ là:

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

+0

Cảm ơn bạn rất nhiều !!! Điều này thực sự sẽ giúp tôi !!! Yay! :) –

+0

Tôi đã thực hiện điều này và nó hoạt động! Cảm ơn bạn rất nhiều. –

+0

+1 Cảm ơn bạn đã giúp đỡ rất nhiều! Tôi không mong muốn phân tích cú pháp tiêu đề HTTP theo cách thủ công :) – jv42

7

Câu trả lời từ Dan Herbert đã giúp tôi thực sự. Tôi đánh giá cao sự giúp đỡ của bạn.

Chỉ muốn đăng việc sử dụng của tôi - hy vọng nó sẽ giúp một số người tại một thời điểm nào đó. Yêu cầu của tôi là tôi cần gửi lại cookie từ http bài trả lời đầu tiên tới yêu cầu đăng bài http thứ hai.

1:

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

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

2:

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

hum Tôi có thể sai nhưng từ những gì tôi đang quan sát gần đây

cookie từ một phản ứng đầu tiên, không bao gồm các ' đặt cookie 'làm cookie có trong tiêu đề (ví dụ: một số id phiên ...) trong trường hợp trạng thái 302 (chuyển hướng)

Nếu autofollowredirect được đặt thành true, thì cookie đã đặt được xử lý và yêu cầu tiếp theo được thực hiện tự động, sẽ bao gồm các cookie được xác định theo cookie được đặt trước trong lần gọi đầu tiên

Nếu autofollowredirect được đặt thành false thì yêu cầu đầu tiên không nhận cookie được định vị bởi cookie đã đặt, và tôi đoán và đây cũng là nhiệm vụ của tôi nếu có ai biết, đó là cách duy nhất để sau đó có cookie trong yêu cầu tiếp theo, phân tích cú pháp cookie đã đặt?

+0

Tôi gặp sự cố với chuyển hướng 302 và đặt AllowAutoRedirect = false. Điều này đã cho tôi một phản hồi "trang này đã chuyển", nhưng sau đó tôi bỏ qua các cookie cùng và chuyển hướng đến trang mà tôi muốn đến ngay từ đầu. – Daryl

+1

[Theo RFC 6265] (http://tools.ietf.org/html/rfc6265#section-3) Tác nhân người dùng CÓ THỂ bỏ qua tiêu đề Set-Cookie chứa trong các câu trả lời với mã trạng thái 100 cấp nhưng phải xử lý Set-Cookie tiêu đề chứa trong các phản hồi khác (bao gồm phản hồi với 400- và mã trạng thái 500 cấp). – Snives

5

Tôi có cùng một vấn đề (với amazon) tôi sử dụng regexp sau:

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);
}

Lưu ý rằng tôi chỉ quan tâm đến cookie tên/giá trị ...

chúc may mắn Elia

+0

Đây là loại giải pháp chính xác mà tôi đang tìm kiếm (đối tượng WebBrowser chỉ cung cấp một chuỗi cho cookie). Tuy nhiên, mã của bạn không biên dịch. – Nuzzolilo