2010-03-11 15 views
15

EDIT: Per quanto ne so, non esiste una soluzione a questo problema, rendendolo ancora un altro testamento al fatto che non si dovrebbe usare WebBrowser di C#. Abbiamo finito con un segnale di avvertimento all'inizio del nostro programma, notificando all'utente che i cookie saranno cancellati per IE.Cancellazione dei cookie del controllo WebBrowser per tutti i siti SENZA compensazione per IE stesso

La versione breve di ciò che sto cercando di fare è nel titolo. Ecco la versione lunga.

Ho un problema un po 'complesso che sono sicuro che riceverò molte supposizioni come risposta a. Al fine di mantenere le ben congegnate, ma purtroppo inutili congetture al minimo, vorrei prima menzionare che la soluzione a questo problema non è semplice, quindi i suggerimenti semplici purtroppo non aiutano affatto, anche se apprezzo lo sforzo.

Il componente .NET WebBrowser è fondamentalmente IE stesso, quindi le soluzioni con qualsiasi tipo di avvertimento quasi certamente non funzioneranno. Ho bisogno di fare esattamente quello che sto cercando di fare, e anche un avvertimento apparentemente minore riuscirà a sconfiggere completamente lo scopo. A rischio di sembrare arrogante, ho bisogno di assistenza da qualcuno che abbia davvero una conoscenza approfondita di .NET WebBrowser e/o WinInet e/o di come comunicare con il sistema sottostante di Windows da C# ... o come incapsulare il codice C++ in C#.

Detto questo, non mi aspetto che nessuno lo faccia per me, e ho trovato alcuni suggerimenti promettenti che verranno spiegati più avanti in questa domanda.

Ma prima ... quello che sto cercando di ottenere è questo.

Possiedo un componente Windows.Forms che contiene un controllo WebBrowser. Questo controllo deve:

  1. Cancella TUTTI i cookie per TUTTI i siti Web.
  2. Visitare diversi siti Web, uno dopo l'altro, e registrare i cookie e gestirli correttamente. Questa parte funziona bene quindi non ho alcun problema con questo.
  3. Risciacquare e ripetere ... teoricamente per sempre.

Ora, ecco il vero problema. Ho bisogno di cancellare tutti quei cookie (per qualsiasi e tutti i siti), ma solo per il controllo WebBrowser stesso e NON i cookie che IE utilizza correttamente. Ciò che è fondamentalmente sbagliato in questo approccio è, naturalmente, il fatto che il controllo .NET WebBrowser è IE. Ma sono un giovane testardo e insisto perché sia ​​possibile, o altrimenti! ;)

Ecco dove sono bloccato al momento.

È semplicemente impossibile cancellare tutti i cookie per il controllo WebBrowser a livello di codice tramite C# da solo. Uno deve usare DllImport e tutte le cose pazze che lo accompagnano. Questo pezzo funziona bene per questo scopo:

[DllImport("wininet.dll", SetLastError = true)] 
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

E poi, nella funzione che in realtà la compensazione dei biscotti:

InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0); 

Allora tutti i cookie vengono cancellati e, come tale, io sono contento. Il programma funziona esattamente come previsto, a parte il fatto che cancella anche i cookie di IE, che non devono poter accadere.

Da un collega StackOverflower (se è una parola), Sheng Jiang ha proposto ad un problema diverso in un commento, ma non ha elaborato ulteriormente:

"Se si desidera isolare i cookie della vostra applicazione è necessario ignorare l'impostazione del registro di directory cache tramite IDocHostUIHandler2 :: GetOverrideKeyPath"

ho guardato in giro in internet per IDocHostUIHandler2 e GetOverrideKeyPath, ma non ho idea di come usarli da C# per isolare i biscotti al mio controllo WebBrowser. La mia esperienza con il registro di Windows è limitata a RegEdit (quindi ho capito che si tratta di una struttura ad albero con diversi tipi di dati, ma questo è tutto ... Non ho alcuna conoscenza approfondita della relazione del registro con IE, per esempio).

Ecco cosa ho scavato su MSDN:

IDocHostUIHandler2 docs: http://msdn.microsoft.com/en-us/library/aa753275%28VS.85%29.aspx

docs GetOverrideKeyPath: http://msdn.microsoft.com/en-us/library/aa753274%28VS.85%29.aspx

Credo di sapere circa cosa queste cose fanno, ho appena don' so come usare.

+0

Il controllo del browser Web .NET (ovviamente non esiste un controllo del browser Web C#) è un wrapper. iexplore.exe è un wrapper. Sono entrambi wrapper attorno alla stessa cosa. Non penso che sarai in grado di farlo, dal momento che entrambi danno accesso allo stesso identico componente. –

+0

Si noti inoltre che i collegamenti della documentazione pubblicati si riferiscono al "controllo WebBrowser". Questo si riferisce al controllo Win32, non alla versione .NET. –

+0

Sì, è esattamente il motivo per cui sono perso. Se fosse la versione .NET, non avrei alcun problema. :) – Teekin

risposta

4

È necessario avere i cookie funzionali in IE allo stesso tempo? È possibile "ripristinare" i cookie originali su IE dopo l'esecuzione del programma?

UPDATE:

Un'altra idea:

Mi chiedo cosa sarebbe successo se è stato eseguito il programma con un account utente diverso, tramite rappresentazione. È possibile che memorizzi tali cookie con un diverso profilo di Windows ...

+0

Hmmm ... idee non pazzesche!Quello che non mi piace dell'idea precedente è che questo programma è destinato agli utenti ... e tutti sappiamo come sono fatti. Anche l'idea di impersonificazione è interessante, anche se scommetto che poi mi imbatterei in problemi con i client su Windows XP e prima ... ma li controllerò, grazie! – Teekin

+0

Se qualcuno con 10 rank ha postato questo messaggio, come * risposta *, sarebbe sicuramente ridicolizzato. –

2

Questo commento allo How to set and delete cookies from WebBrowser Control for arbitrary domains è un errore. L'impostazione della cartella cache di WinInet apparentemente non è nelle impostazioni di IE, ma è un'impostazione della cartella Shell, poiché IDocHostUIHandler2 può solo personalizzare le impostazioni memorizzate nella chiave di registro di IE, non è utile per questa attività. Non conosco un modo per personalizzare il percorso della cartella tranne per agganciare tutte le API WinInet (e bloccato con l'aggiornamento dell'applicazione per ospitare future API WinInet), cosa non facile in C#. Aggiornerò il vecchio post ora.

+0

Grazie per aver risposto, Sheng. – Teekin

Problemi correlati