Ich habe zuvor einen CookieContainer mit HttpWebRequest- und HttpWebResponse-Sitzungen verwendet, möchte ihn jetzt jedoch mit einem WebClient verwenden. Soweit ich weiß, gibt es keine integrierte Methode wie für HttpWebRequests ( request.CookieContainer
). Wie kann ich Cookies von einem WebClient in einem CookieContainer sammeln?
Ich habe danach gegoogelt und folgendes Beispiel gefunden :
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;
}
}
Ist das der beste Weg, es zu tun?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
quelle
quelle
m_container
ist nie festgelegt!? Ist es nicht immer leer?Antworten:
Ja. IMHO ist das Überschreiben von GetWebRequest () die beste Lösung für die eingeschränkte Funktionalität von WebClient. Bevor ich von dieser Option wusste, schrieb ich viel wirklich schmerzhaften Code auf der HttpWebRequest-Ebene, da WebClient fast, aber nicht ganz das tat, was ich brauchte. Die Ableitung ist viel einfacher.
Eine andere Option besteht darin, die reguläre WebClient-Klasse zu verwenden, den Cookie-Header jedoch manuell zu füllen, bevor die Anforderung gestellt wird, und dann den Set-Cookies-Header in der Antwort herauszuziehen. Es gibt Hilfsmethoden auf der Cookie Klasse , die diese Header erleichtern das Erstellen und Analysieren von :
CookieContainer.SetCookies()
undCookieContainer.GetCookieHeader()
, respectively.Ich bevorzuge den früheren Ansatz, da er für den Anrufer einfacher ist und weniger sich wiederholenden Code erfordert als die zweite Option. Der Ableitungsansatz funktioniert auch für mehrere Erweiterbarkeitsszenarien (z. B. Cookies, Proxys usw.) auf dieselbe Weise.
quelle
Aus Kommentaren
Wie formatieren Sie den Namen und den Wert des Cookies anstelle von "somecookie"?
Für mehrere Cookies:
quelle
Dies ist nur eine Erweiterung des Artikels, den Sie gefunden haben.
quelle
readonly
Modifikator descontainer
Feldes entfernen , sonst können Sie ihn nicht in der Eigenschaft festlegen. Ich habe den Code geändert.Set-Cookie
Antwort - Header inReadCookies
?GetWebResponse
undReadCookies
, da die Cookies automatisch den Behälter hinzukommen.Der HttpWebRequest ändert den ihm zugewiesenen CookieContainer. Zurückgegebene Cookies müssen nicht verarbeitet werden. Ordnen Sie einfach Ihren Cookie-Container jeder Webanforderung zu.
quelle
Ich denke, es gibt eine sauberere Möglichkeit, keinen neuen Webclient zu erstellen (und dies funktioniert auch mit Bibliotheken von Drittanbietern).
Jetzt müssen Sie sich nur noch für die Domains entscheiden, die Sie verwenden möchten:
Das bedeutet, dass JEDE Webanforderung, die an example.com geht, jetzt Ihren benutzerdefinierten Webanforderungsersteller verwendet, einschließlich des Standard-Webclients. Dieser Ansatz bedeutet, dass Sie nicht Ihren gesamten Code berühren müssen. Sie rufen das Registerpräfix einfach einmal auf und sind fertig. Sie können sich auch für das Präfix "http" registrieren, um sich überall für alles zu entscheiden.
quelle