2010-05-13 10 views
22

Ich lade eine Website mithilfe der Navigate-Funktion eines WebBrowsers und möchte, dass der Browser die Seite mit einem Cookie lädt, den ich ihm gegeben habe.Setzen eines Cookies in einem WebBrowser-Steuerelement

Der folgende Code funktioniert nicht:

wb.Navigate(url, null, null, "Cookie: " + cookie + "\n"); 

Was mache ich falsch? Muss ich InternetSetCookie verwenden? Dies scheint nicht die beste Lösung zu sein.

+0

Haben Sie eine Antwort darauf gefunden? –

+0

Leider nein. –

Antwort

19

Sieht aus wie es eine bessere Art und Weise ist:

Import der InternetSetCookie Funktion:

[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern bool InternetSetCookie(string lpszUrlName, string lpszCookieName, string lpszCookieData); 

Erstellen Sie das Cookie Objekt:

Cookie temp1 = new Cookie("KEY1", "VALUE1", "/Path/To/My/App", "/"); 

Aufruf InternetSetCookie Funktion für diese URL den Cookie zu setzen

InternetSetCookie("https://my.url.com/Path/To/My/App", null, temp1.ToString() + "; expires = Sun, 01-Jan-2013 00:00:00 GMT"); 

Navigate die WebBrowser zu der URL, die Sie besuchen möchten.

webBrowser1.Navigate("https://my.url.com/Path/To/My/App"); 

Denken Sie, das ist die beste Lösung für das Problem :).

+1

Für jeden, der versucht, den 'expires =' Teil von einem DateTime-Objekt zu erhalten, hier ist, wie es geht: myDateTimeObj.ToUniversalTime().ToString("ddd, dd-MMM-yyyy HH:mm:ss") + " GMT" Daniel

+0

Link tot, aber zum Glück haben Sie den Code eingefügt! – TEK

+0

Wenn Sie nur für die Sitzung einen Cookie im Speicher einrichten müssen, können Sie direkt anrufen: InternetSetCookieEx ("https://my.url.com/Path/To/My/App", "KEY1", "VALUE1" , NULL, NULL). Hinweis: Es gibt einen Unterschied zwischen dem Aufrufen von InternetSetCookie und InternetSetCookieEx (http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx). In der Praxis habe ich beobachtet, dass alle nachfolgenden Anfragen, die von der Seite gemacht wurden, das Cookie nur dann enthalten, wenn Sie die "Ex" -Methode verwenden. –

3

The proper way is using InternetSetCookieEx.

[DllImport("wininet.dll")] 
static extern InternetCookieState InternetSetCookieEx(
    string lpszURL, 
    string lpszCookieName, 
    string lpszCookieData, 
    int dwFlags, 
    int dwReserved); 

enum InternetCookieState : int 
{ 
    COOKIE_STATE_UNKNOWN = 0x0, 
    COOKIE_STATE_ACCEPT = 0x1, 
    COOKIE_STATE_PROMPT = 0x2, 
    COOKIE_STATE_LEASH = 0x3, 
    COOKIE_STATE_DOWNGRADE = 0x4, 
    COOKIE_STATE_REJECT = 0x5, 
    COOKIE_STATE_MAX = COOKIE_STATE_REJECT 
} 

Hier einige Code, um es zu einem website that shows your HTTP headers zu testen.

InternetSetCookieEx("http://request.urih.com/", null, "TestData=Test;", 0, 0); 
webBrowser1.Navigate("http://request.urih.com/"); 
+0

Ich erhalte doppelte Cookies, wenn ich dies tue. Habe die Cookie-Domain mit und ohne End-Schrägstrich ausprobiert. habe den Wert mit und ohne Semikolon ausprobiert. Habe versucht, das Name/Wert-Paar nicht zu trimmen und zu trimmen. Ich frage mich nur, wenn Sie in der Produktion ein Problem gefunden, die Einstellung von Cookies behoben und vielleicht Ihre Antwort nicht aktualisiert haben. –

+0

Um zu klären, wenn ich Cookies gesetzt habe ich in einer Datenbank gespeichert und dann die 3rd Party Website setzt sie, sie am Ende duplizieren. –

Verwandte Themen