2009-04-21 6 views
10

Czy istnieje sposób, aby obiekt HttpWebRequest wziął pod uwagę nagłówek zestawu plików cookie podczas automatycznego przekierowania na inną stronę za pomocą funkcji AllowAutoRedirect? Potrzebuję go do utrzymania informacji o plikach cookie w przekierowaniach; Raczej nie będę musiał implementować przekierowania, jeśli ramy mogą to dla mnie zrobić. To musi być powszechne żądanie, ponieważ większość stron logowania, które widziałem, zwykle to robi.Jak uzyskać HttpWebRequest.AllowAutoRedirect, aby ustawić pliki cookie podczas wykonywania GET/POST na poprawionej stronie?

Odpowiedz

5

Wiem, że osobne żądania (np. Różne obiekty HttpRequest) działają z plikami cookie, należy ustawić właściwość HttpRequest.CookieContainer w obu żądaniach do tego samego wystąpienia obiektu CookieContainer. Możesz potrzebować tego również w tym przypadku.

+0

Z jakiegoś powodu nie zadziałało to dla mnie. Kiedy domainA.com wydał SetCookie cookie = val dla ".subdomain.domainB.com", najwyraźniej okres na początku wartości cookie oznaczał mylącą wbudowaną klasę CookieContainer .NET oraz żądania dotyczące subdomain.domainB.com , ciasteczko nigdy nie zostało wysłane z tymi żądaniami, mimo że CookieContainer został poprawnie przypisany do Żądania. –

+1

Więc moje rozwiązanie było w moim konkretnym prostym przypadku (efektywna interakcja z tylko jedną stroną): 1) disalow auto-przekierowania, więc widzę wszystkie nagłówki Set-cookies i mogę je analizować; 2) Zapisz wszystkie pary nazwy-plików cookie w słowniku (w razie potrzeby sprawdzaj unikatowość i aktualizuj wartości); i na koniec: 3) przy każdej kolejnej prośbie trun ten dane stronicowania do specjalnie spreparowanego nagłówka Cookies dodawanego ręcznie do żądania (zauważ, że CookiContrainer żądania musi mieć wartość zerową, aby działał); wszystkie ciasteczka przeszły i zadziałało. –

0

Jeśli nie chcesz używać kontenera CookieContainer, poniższy kod uzyska dostęp do strony, podając plik cookie w parametrze. Następnie pobierze wszystkie pliki cookie ustawione przez tę stronę i zwróci je jako Listę łańcuchów.

Należy pamiętać, że parametr AllowAutoRedirect ma wartość false. Jeśli chcesz wykonać przekierowanie, wyciągnij ten obiekt z nagłówków HttpWebResponse, a następnie ręcznie skonstruuj inne żądanie WWW.

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 
Powiązane problemy