2010-05-13 17 views
18

Chciałbym, aby VB.net WebClient pamiętał ciasteczka.Jak mogę zmusić WebClient do używania plików cookie?

Szukałem i wypróbowałem wiele klas przeciążenia.

Chcę zalogować się do strony internetowej za pośrednictwem POST, następnie POST na inną stronę i uzyskać jego zawartość, zachowując jednocześnie moją sesję.

Czy jest to możliwe z VB.net bez użycia kontrolki WebBrowser?

Próbowałem Chilkat.HTTP i to działa, ale chcę korzystać z bibliotek .Net.

Odpowiedz

44

Utwórz nową klasę dziedziczek z WebClient, który przechowuje plik CookieContainer taki jak @Guffa. Oto kod, który używam, że robi to, a także utrzymuje odsyłający żyje:

Public Class CookieAwareWebClient 
    Inherits WebClient 

    Private cc As New CookieContainer() 
    Private lastPage As String 

    Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest 
     Dim R = MyBase.GetWebRequest(address) 
     If TypeOf R Is HttpWebRequest Then 
      With DirectCast(R, HttpWebRequest) 
       .CookieContainer = cc 
       If Not lastPage Is Nothing Then 
        .Referer = lastPage 
       End If 
      End With 
     End If 
     lastPage = address.ToString() 
     Return R 
    End Function 
End Class 

Oto wersja C# powyższego kodu:

using System.Net; 
class CookieAwareWebClient : WebClient 
{ 
    private CookieContainer cc = new CookieContainer(); 
    private string lastPage; 

    protected override WebRequest GetWebRequest(System.Uri address) 
    { 
     WebRequest R = base.GetWebRequest(address); 
     if (R is HttpWebRequest) 
     { 
      HttpWebRequest WR = (HttpWebRequest)R; 
      WR.CookieContainer = cc; 
      if (lastPage != null) 
      { 
       WR.Referer = lastPage; 
      } 
     } 
     lastPage = address.ToString(); 
     return R; 
    } 
} 
+0

Spróbuję tego. Dziękuję Ci. Jest podobny do innych dziedziczonych, a następnie klas przeciążenia, które znalazłem. – Jeremy

+0

Używam tego od lat z absolutnym sukcesem. Jeśli to nie działa, to nie jest to problem z plikiem cookie/sesją, ale prawdopodobnie strona, którą przeglądasz, używa javascript do modyfikacji stanu formularza. Jeśli tak jest, sprawdź albo javascript, albo użyj monitora pakietów lub skrzypka, aby zobaczyć, co faktycznie jest wysyłane przez przewód. –

+0

może ne1 opublikować to w języku C#, a mój problm jest również podobny, napisałem pytanie do tego, ale nie dostałem odpowiednich odpowiedzi .. nadal szukać odpowiedzi .. – FosterZ

4

Nie można uczynić klasy WebClient pamięcią o ciasteczkach, trzeba pobrać kontener cookie z odpowiedzi i użyć go w następnym żądaniu.

+0

Dzięki za sugestię. – Jeremy

Powiązane problemy