2010-07-19 6 views
0

J'ai une application qui utilise le contrôle de Webbrowser pour naviguer vers quelques sites de fournisseurs et pour rapporter des rapports. Parce qu'il y a plusieurs comptes avec un fournisseur, j'ai besoin que le navigateur termine sa session et efface tout ensemble de cookies. J'utilise des appels API à wininet.dll pour les deux et je suis en mesure d'atteindre le résultat souhaité. Cependant, par intermittence, j'obtiens ce qui semble être un blocage sur InternetSetOption pour INTERNET_OPTION_END_BROWSER_SESSION.InternetSetOption blocage?

Il s'agit d'un code très linéaire et InternetSetOption est appelé à partir d'un seul thread au même endroit. Ce qui le rend difficile à comprendre, c'est que pendant le débogage, je n'ai que très rarement réussi à reproduire le problème. Dès que je compile et que je cours en dehors de VS, cela arrivera peu de temps après. Je l'ai isolé à cela en pompant des messages sur la console pendant son fonctionnement.

Les quelques fois où j'ai été capable d'attraper le problème lors du débogage, il affiche simplement InternetSetOption comme instruction suivante et s'assied, sans exception ni erreur, rien dans la fenêtre de sortie. InternetSetOption devrait renvoyer un booléen, mais le programme n'ira pas plus loin et je ne reçois jamais aucun retour de l'appel d'API. J'ai essayé de regarder le dernier message d'erreur lancé, mais dans ce cas, il n'aide pas, car il ne jette jamais une erreur.

Quelqu'un at-il des commentaires sur ce que je peux faire pour déboguer cela?

Déclaré comme:

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

Et appelé par:

InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0); 
+0

Qu'est-ce que cela a à voir avec C#? –

+0

L'application a été écrite en C# et inclut un contrôle Webbrowser – kmfk

Répondre

2

Pour toute personne qui vient à travers cela et, par hasard, a le même problème - le problème semble être causé par une fonction J'ai trouvé sur le site de MSDN pour effacer le cache et les cookies. found here.

Il y avait plusieurs problèmes dans cette fonction ClearCache(), l'un étant entre x86 et x64 et comment il référencé les fichiers de cache pour les supprimer -

Dans la fonction actuelle, il calles DeleteUrlCacheEntry comme ceci:

DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName); 

Cependant, x64 est devrait être

DeleteUrlCacheEntry(internetCacheEntry.lpszLocalFileName); 

Vous devez basculer entre ceux basés sur la plate-forme, une référence unique ne fonctionne pas à la fois x64 et x86. Point discutable pour moi, cependant. Cette fonction jette souvent des exceptions de violation d'accès, et même lorsqu'elle est interceptée et gérée, je crois que c'était la racine de InternetSetOption exécutant ce qui semblait être un blocage. Encore une fois, n'a jamais été en mesure de résoudre le problème en raison de la nature étrange de l'impasse, pour moi d'utiliser à la fois cette fonction ClearCache() ET InternetSetOption. Changer la séquence des deux appels de fonctions ne l'a pas corrigé. J'ai supprimé la classe WebBrowserHelper et j'ai recouru à la suppression du cache et des cookies en exécutant RunDLL32 et en attendant que ce processus se termine.

Espérons que cela aide quelqu'un!