Wcześniej użyłem CookieContainer z sesjami HttpWebRequest i HttpWebResponse, ale teraz chcę go używać z WebClient. O ile rozumiem, nie ma wbudowanej metody, takiej jak w przypadku HttpWebRequests ( request.CookieContainer
). Jak mogę zbierać pliki cookie z WebClient w CookieContainer?
I googled to i znaleźć następujące próbki :
public class CookieAwareWebClient : WebClient
{
private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
}
return request;
}
}
Czy to najlepszy sposób na zrobienie tego?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
źródło
źródło
m_container
nigdy nie jest ustawione !? Czy to nie zawsze jest puste?Odpowiedzi:
Tak. IMHO, przesłanianie GetWebRequest () jest najlepszym rozwiązaniem ograniczonej funkcjonalności WebClienta. Zanim dowiedziałem się o tej opcji, napisałem wiele naprawdę bolesnego kodu w warstwie HttpWebRequest, ponieważ WebClient prawie, ale nie do końca, zrobił to, czego potrzebowałem. Wyprowadzenie jest znacznie łatwiejsze.
Inną opcją jest użycie zwykłej klasy WebClient, ale ręczne wypełnienie nagłówka Cookie przed wysłaniem żądania, a następnie wyciągnięcie nagłówka Set-Cookies z odpowiedzi. W klasie CookieContainer istnieją metody pomocnicze, które ułatwiają tworzenie i analizowanie tych nagłówków:
CookieContainer.SetCookies()
iCookieContainer.GetCookieHeader()
, odpowiednio.Wolę to pierwsze podejście, ponieważ jest łatwiejsze dla dzwoniącego i wymaga mniej powtarzalnego kodu niż druga opcja. Ponadto metoda wyprowadzania działa w ten sam sposób w przypadku wielu scenariuszy rozszerzalności (np. Pliki cookie, serwery proxy itp.).
źródło
Z komentarzy
Jak sformatować nazwę i wartość pliku cookie zamiast „somecookie”?
W przypadku wielu plików cookie:
źródło
Ten jest tylko rozszerzeniem znalezionego artykułu.
źródło
readonly
modyfikatorcontainer
pola, w przeciwnym razie nie możesz go ustawić we właściwości. Zmodyfikowałem kod.Set-Cookie
nagłówka odpowiedziReadCookies
?GetWebResponse
iReadCookies
, ponieważ pliki cookie zostaną automatycznie dodane do kontenera.HttpWebRequest modyfikuje przypisaną do niego CookieContainer. Nie ma potrzeby przetwarzania zwróconych plików cookie. Po prostu przypisz swój kontener cookie do każdego żądania internetowego.
źródło
Myślę, że istnieje bardziej przejrzysty sposób, w którym nie musisz tworzyć nowego klienta internetowego (i będzie działać również z bibliotekami innych firm)
Teraz wszystko, co musisz zrobić, to wybrać domeny, których chcesz używać:
Oznacza to, że KAŻDE zapytanie internetowe, które trafia do example.com, będzie teraz używać Twojego niestandardowego kreatora zapytań internetowych, w tym standardowego klienta internetowego. Takie podejście oznacza, że nie musisz dotykać całego kodu. Wystarczy raz wywołać prefiks rejestru i skończyć z tym. Możesz także zarejestrować prefiks „http”, aby akceptować wszystko wszędzie.
źródło