2009-04-21 17 views
10

Có cách nào để lấy đối tượng HttpWebRequest để xem xét tiêu đề tập hợp cookie khi được tự động chuyển hướng đến một trang khác thông qua tính năng AllowAutoRedirect không? Tôi cần nó để duy trì thông tin cookie trên các chuyển hướng; Tôi không muốn tự mình thực hiện chuyển hướng nếu khung làm việc có thể làm điều này cho tôi. Đây phải là một yêu cầu phổ biến vì hầu hết các trang đăng nhập tôi đã nhìn thấy thường làm điều này.Cách nhận HttpWebRequest.AllowAutoRedirect để đặt cookie khi thực hiện GET/POST trên trang được chỉnh sửa?

Trả lời

5

Tôi biết để thực hiện các yêu cầu riêng biệt (ví dụ: các đối tượng HttpRequest khác nhau) hoạt động với cookie, bạn cần đặt thuộc tính HttpRequest.CookieContainer trên cả hai yêu cầu cho cùng một phiên bản CookieContainer. Bạn có thể cần điều đó cho trường hợp này là tốt.

+0

Vì một số lý do, điều này không hiệu quả đối với tôi. Khi domainA.com đã phát hành SetCookie cookie = val cho ".subdomain.domainB.com", rõ ràng là khoảng thời gian bắt đầu của giá trị tên miền cookie nhầm lẫn .NET được xây dựng trong lớp CookieContainer và khi yêu cầu được thực hiện cho subdomain.domainB.com , cookie chưa bao giờ được gửi cùng với các yêu cầu đó, mặc dù CookieContainer đã được gán đúng yêu cầu. –

+1

Vì vậy, giải pháp của tôi là trong trường hợp cụ thể đơn giản của tôi (tương tác hiệu quả với chỉ 1 trang web) là: 1) dissalow tự động chuyển hướng, vì vậy tôi nhận được để xem tất cả các tiêu đề Set-cookie và có thể phân tích chúng; 2) Lưu tất cả các cặp tên-giá trị cookie vào một từ điển (kiểm tra tính duy nhất và cập nhật các giá trị khi cần); và cuối cùng: 3) với mỗi yêu cầu tiếp theo trun rằng dữ liệu nhị phân vào một tiêu đề Cookies được tạo tùy chỉnh theo cách thủ công được thêm vào yêu cầu (lưu ý rằng CookiContrainer của yêu cầu phải là null để nó hoạt động); sau đó tất cả các cookie đã trải qua và nó hoạt động. –

0

Nếu bạn không muốn sử dụng CookieContainer, mã sau sẽ truy cập trang, cung cấp cookie trong tham số. Sau đó, nó sẽ tải xuống tất cả các cookie được đặt bởi trang đó và trả lại chúng dưới dạng Danh sách các chuỗi.

Lưu ý rằng AllowAutoRedirect được đặt thành false. Nếu bạn muốn theo dõi chuyển hướng, hãy kéo đối tượng đó ra khỏi tiêu đề HttpWebResponse và sau đó tự xây dựng một yêu cầu web khác.

Public Shared Function GetCookiesSetByPage(ByVal strUrl As String, ByVal cookieToProvide As String) As IEnumerable(Of String) 

    Dim req As System.Net.HttpWebRequest 
    Dim res As System.Net.HttpWebResponse 
    Dim sr As System.IO.StreamReader 

    '--notice that the instance is created using webrequest 
    '--this is what microsoft recomends 
    req = System.Net.WebRequest.Create(strUrl) 

    'set the standard header information 
    req.Accept = "*/*" 
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)" 
    req.ContentType = "application/x-www-form-urlencoded" 
    req.AllowAutoRedirect = False 
    req.Headers.Add(HttpRequestHeader.Cookie, cookieToProvide) 
    res = req.GetResponse() 

    'read in the page 
    sr = New System.IO.StreamReader(res.GetResponseStream()) 
    Dim strResponse As String = sr.ReadToEnd 

    'Get the cooking from teh response 
    Dim strCookie As String = res.Headers(System.Net.HttpResponseHeader.SetCookie) 
    Dim strRedirectLocation As String = res.Headers(System.Net.HttpResponseHeader.Location) 
    Dim result As New List(Of String) 
    If Not strCookie = Nothing Then 
     result.Add(strCookie) 
    End If 
    result.Add(strRedirectLocation) 
    Return result 
End Function 
Các vấn đề liên quan