2012-06-22 12 views
20

Próbuję badanej jednostki jakiś kod i muszę wymienić to:Jak dodać pliki cookie do WebRequest?

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri); 
    httpWebRequest.CookieContainer = new CookieContainer(); 

z

WebRequest webRequest = WebRequest.Create(uri); 
    webRequest.CookieContainer = new CookieContainer(); 

Zasadniczo, jak mogę dostać ciasteczka do żądania bez używania HttpWebRequest?

+0

To byłoby trudne, ponieważ ciasteczka są koncepcją HTTP. Czy jest jakiś powód, dla którego musisz dokonać tej zmiany? – dlev

+0

@dlev - WebRequest utworzy HttpWebRequest na podstawie uri. Dlatego, jeśli chcę wykpić swój własny obiekt WebRequest i/lub zarejestrować mój własny uri, który również zwraca WebRequest, to nie chcę ograniczać metody tylko do pracy z obiektem HttpWebRequest. –

+1

Rozumiem, że typem run-time 'webRequest' będzie' HttpWebRequest'. Ale dostęp do 'CookieContainer' wymaga, aby typem kompilacji był' HttpWebRequest'. Wspomniałeś również, że nie ograniczasz się do HTTP, ale w tym przypadku pliki cookie nie mają większego znaczenia, ponieważ są konstrukcją HTTP (co jest przyczyną ich braku w "WebRequest".) – dlev

Odpowiedz

22

oparciu o komentarze, warto rozważyć napisanie extension method:

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie) 
{ 
    HttpWebRequest httpRequest = webRequest as HttpWebRequest; 
    if (httpRequest == null) 
    { 
     return false; 
    } 

    if (httpRequest.CookieContainer == null) 
    { 
     httpRequest.CookieContainer = new CookieContainer(); 
    } 

    httpRequest.CookieContainer.Add(cookie); 
    return true; 
} 

Wtedy można mieć kod jak:

WebRequest webRequest = WebRequest.Create(uri); 
webRequest.TryAddCookie(new Cookie("someName","someValue")); 
+1

Ten kod zwraca: "Parametr" {0} "nie może być pustym ciągiem." w linii httpRequest.CookieContainer.Add (cookie) ;. Dowolny pomysł? –

+2

@drdigit To dlatego, że nie utworzyłeś pliku cookie zawierającego domenę. Ponadto, jestem całkiem pewien, że ciąg błędu jest błędem w BCL (który, niestety, wydaje się pozostawał w wersji 4.5). – dlev

+0

Wielkie dzięki za szczegółową odpowiedź. –

3

spróbuj coś takiego:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html"); 
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour")); 
+0

Nie chodzi o ustawienie cookie do odpowiedzi.Chodzi o Tworzenie nowego WebRequest i ustawienie pliku cookie dla tego żądania (i przeglądanie tagów pytania, wykonywanie żądania z testu urządzenia). –

+2

spowoduje to błąd "Odwołanie do obiektu nie jest ustawione na ...". Najpierw możemy potrzebować 'request.CookieContainer = new CookieContainer(); następnie wywołaj metodę Add. – shashwat

6

WebRequest jest klasą abstrakcyjną, która nie ma właściwości CookieContainer. Ponadto nie można użyć kolekcji Nagłówki (nie zaimplementowano wyjątku), więc każda próba, taka jak webRequest.Headers.Add ("Cookie", "...") zakończy się niepowodzeniem.

Przepraszamy, ale nie masz szansy na użycie plików cookie w WebRequest.

Trzymaj się HttpWebRequest i dodaj/edytuj dowolną liczbę ciasteczek, które lubisz, korzystając z kolekcji Nagłówki!

+0

Tego się bałem. –

+0

Ja tego nie zrobiłem :) Twoje wymaganie "if then addcookies" może być pokryte przez HttpWebRequest.Headers.Add ("Cookie", "..."). –

0

Odpowiedź dlev zakończyła się, ale miałem problemy z implementacją rozwiązania ("Parametr" {0} "nie może być pustym ciągiem."), Więc zdecydowałem napisać pełny kod na wypadek, gdyby ktoś miał podobne problemy .

Moim celem było pobranie html jako napisu, ale musiałem dodać pliki cookie do żądania sieci. Jest to funkcja, która pobiera ciąg za pomocą cookies:

public static string DownloadString(string url, Encoding encoding, IDictionary<string, string> cookieNameValues) 
{ 
    using (var webClient = new WebClient()) 
    { 
     var uri = new Uri(url); 
     var webRequest = WebRequest.Create(uri); 
     foreach(var nameValue in cookieNameValues) 
     { 
      webRequest.TryAddCookie(new Cookie(nameValue.Key, nameValue.Value, "/", uri.Host)); 
     }     
     var response = webRequest.GetResponse(); 
     var receiveStream = response.GetResponseStream(); 
     var readStream = new StreamReader(receiveStream, encoding); 
     var htmlCode = readStream.ReadToEnd();     
     return htmlCode; 
    } 
} 

Jesteśmy przy użyciu kodu z dlev za odpowiedź:

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie) 
{ 
    HttpWebRequest httpRequest = webRequest as HttpWebRequest; 
    if (httpRequest == null) 
    { 
     return false; 
    } 

    if (httpRequest.CookieContainer == null) 
    { 
     httpRequest.CookieContainer = new CookieContainer(); 
    } 

    httpRequest.CookieContainer.Add(cookie); 
    return true; 
} 

W ten sposób można korzystać z pełnej kod:

var cookieNameValues = new Dictionary<string, string>(); 
cookieNameValues.Add("varName", "varValue"); 
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues); 
Powiązane problemy