2012-06-22 20 views
20

Ich versuche, einige Code zu Unit-Test, und ich brauche, um diese zu ersetzen:Wie fügt man WebRequest Cookies hinzu?

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

mit

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

Grundsätzlich wie bekomme ich Cookies in die Anfrage ohne HttpWebRequest zu verwenden?

+0

Das wäre schwierig, da Cookies ein HTTP-Konzept sind. Gibt es einen Grund, warum du diese Änderung vornehmen musst? – dlev

+0

@dlev - WebRequest erstellt eine HttpWebRequest basierend auf der URI. Wenn ich also mein eigenes WebRequest-Objekt mockern und/oder mein eigenes URI registrieren möchte, das auch eine WebRequest zurückgibt, möchte ich die Methode nicht darauf beschränken, nur mit einem HttpWebRequest-Objekt zu arbeiten. –

+1

Ich verstehe, dass der Laufzeittyp von 'webRequest'' HttpWebRequest' ist. Aber der Zugriff auf 'CookieContainer' erfordert, dass der Kompilierzeittyp' HttpWebRequest' ist. Sie erwähnen auch, dass Sie sich nicht auf HTTP beschränken, aber in diesem Fall bedeuten Cookies nicht viel, da sie ein HTTP-Konstrukt sind (was der Grund für ihre Abwesenheit auf "WebRequest" ist.) – dlev

Antwort

22

Basierend auf Ihre Kommentare, könnten Sie schreiben ein 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; 
} 

Dann können Sie Code wie:

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

Dieser Code gibt zurück: "Der Parameter '{0}' darf keine leere Zeichenfolge sein." online httpRequest.CookieContainer.Add (Cookie) ;. Irgendeine Idee? –

+2

@drdigit Dies liegt daran, dass Sie kein Cookie mit einer Domäne erstellt haben. Außerdem bin ich mir ziemlich sicher, dass die Fehlerzeichenfolge ein Fehler in der BCL ist (der leider in 4.5 zu bleiben scheint) – dlev

+0

Vielen Dank für die ausführliche Antwort. –

3

Versuchen mit etwas wie folgt aus:

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

Die Frage ist nicht über Cookie an den Ansprecheinstellungsanzeige.Es geht darum, ein neues WebRequest zu erstellen und ein Cookie für diese Anfrage zu setzen (und die Tags der Frage zu betrachten, die Anfrage aus dem Komponententest auszuführen). –

+2

Dies wird einen Fehler "Objektreferenz nicht auf ein ... gesetzt" werfen. Zuerst brauchen wir vielleicht 'request.CookieContainer = new CookieContainer();' dann sollte die Add-Methode funktionieren. – shashwat

6

WebRequest ist eine abstrakte Klasse, die keine CookieContainer-Eigenschaft besitzt. Außerdem können Sie die Header-Sammlung nicht verwenden (nicht implementierte Ausnahme), so dass jeder Versuch wie webRequest.Headers.Add ("Cookie", "...") fehlschlägt.

Es tut uns leid, aber Sie haben keine Chance, Cookies mit WebRequest zu verwenden.

Stick auf HttpWebRequest und hinzufügen/bearbeiten so viele Cookies wie Sie möchten mit seiner Headers Sammlung!

+0

Das war, wovor ich Angst hatte. –

+0

Ich habe es nicht getan :) Ihre Anforderung "wenn dann addcookies" kann durch die HttpWebRequest.Headers.Add ("Cookie", "...") abgedeckt werden. –

0

dlevs Antwort funktionierte, aber ich hatte Probleme beim Implementieren der Lösung ("Der Parameter '{0}' darf kein leerer String sein."), Also habe ich beschlossen, den kompletten Code zu schreiben, falls jemand ähnliche Probleme hat .

Mein Ziel war es, den HTML-Code als Zeichenfolge zu erhalten, aber ich musste die Cookies zur Webanforderung hinzufügen. Dies ist die Funktion, die die Zeichenfolge mit den Cookies Downloads:

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; 
    } 
} 

Wir sind den Code aus dlev Antwort mit:

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; 
} 

Dies ist, wie Sie den vollständigen Code verwenden:

var cookieNameValues = new Dictionary<string, string>(); 
cookieNameValues.Add("varName", "varValue"); 
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues); 
Verwandte Themen