Question

Je suis en train de changer le UserAgent du contrôle WebBrowser dans une application Winforms.

Je l'ai réalisé avec succès ce en utilisant le code suivant:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;

public void ChangeUserAgent()
{
    List<string> userAgent = new List<string>();
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

Le seul problème est que cela fonctionne qu'une seule fois. Lorsque je tente d'exécuter la méthode ChangeUserAgent () pour la deuxième fois, il ne fonctionne pas. Il reste fixé à la première valeur modifiée. Ceci est assez ennuyeux et je l'ai tout essayé mais ça ne changera pas plus d'une fois.

Quelqu'un sait-il d'une approche différente, plus souple?

Merci

Était-ce utile?

La solution

Je ne sais pas si je devrais copier / coller à partir d'un

Autres conseils

La meilleure façon:

webBrowser.Navigate("http://localhost/run.php", null, null,
                    "User-Agent: Here Put The User Agent");

En outre, il existe une option de rafraîchissement dans la fonction (selon la MSDN ). Il a bien fonctionné pour moi (vous devez définir avant tout changement d'agent utilisateur). Ensuite, le code de question pourrait être modifié comme suit:

[DllImport("urlmon.dll", CharSet = CharSet.Ansi)]
private static extern int UrlMkSetSessionOption(
    int dwOption, string pBuffer, int dwBufferLength, int dwReserved);

const int URLMON_OPTION_USERAGENT = 0x10000001;
const int URLMON_OPTION_USERAGENT_REFRESH = 0x10000002;

public void ChangeUserAgent()
{
    string ua = "Googlebot/2.1 (+http://www.google.com/bot.html)";

    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT_REFRESH, null, 0, 0);
    UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, ua, ua.Length, 0);
}

Je voudrais ajouter à la réponse de @Jean Azzopardi.

void BeforeNavigate(object pDisp, ref object url, ref object flags, ref object targetFrameName,
        ref object postData, ref object headers, ref bool cancel)
{
    // This alone is sufficient, because headers is a "Ref" parameters, and the browser seems to pick this back up.
    headers += string.Format("User-Agent: {0}\r\n", UserAgent);
}

Cette solution fonctionne le mieux pour moi. Utilisation de l'renavigating a causé d'autres problèmes étranges pour moi, comme le contenu du navigateur de disparaître tout à coup, et parfois obtenir encore le navigateur non pris en charge. Avec cette technique, toutes les demandes de Fiddler ont eu le bon agent utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top