Comment puis-je accéder à PostData à partir du gestionnaire d'événements WebBrowser.Navigating?

StackOverflow https://stackoverflow.com/questions/141626

  •  02-07-2019
  •  | 
  •  

Question

J'ai un formulaire Windows dans Visual Studio 2008 en utilisant .NET 3.5 qui contient un contrôle WebBrowser. Je dois analyser les données PostData du formulaire dans le gestionnaire d'événements Navigating avant que la demande ne soit envoyée. Y a-t-il un moyen d'y arriver?

L'ancien contrôle de navigateur Win32 comportait un événement Before_Navigate dont l'un des arguments était PostData. Ce n’est pas le cas avec le nouveau contrôle .NET WebBrowser.

Était-ce utile?

La solution

Cette fonctionnalité n'est pas exposée par le contrôle .NET WebBrowser. Heureusement, ce contrôle est principalement une enveloppe autour du «vieux» contrôle. Cela signifie que vous pouvez vous abonner à l'événement BeforeNavigate2 que vous connaissez et aimez (?) En utilisant l'un des éléments suivants (après avoir ajouté une référence à SHDocVw à votre projet):

Dim ie = DirectCast(WebBrowser1.ActiveXInstance, SHDocVw.InternetExplorer)
AddHandler ie.BeforeNavigate2, AddressOf WebBrowser_BeforeNavigate2

... et faites ce que vous voulez pour les PostData dans cet événement:

Private Sub WebBrowser_BeforeNavigate2(ByVal pDisp As Object, ByRef URL As Object, _
       ByRef Flags As Object, ByRef TargetFrameName As Object, _
       ByRef PostData As Object, ByRef Headers As Object, ByRef Cancel As Boolean)
    Dim PostDataText = System.Text.Encoding.ASCII.GetString(PostData)
End Sub

Une mise en garde importante: la documentation relative à la La propriété WebBrowser.ActiveXInstance indique que "Cette API prend en charge l’infrastructure .NET Framework et ne doit pas être utilisée directement à partir de votre code". En d'autres termes: votre utilisation de la propriété peut interrompre votre application à tout moment, par exemple lorsque les utilisateurs de Framework décident d'implémenter leur propre composant de navigateur, au lieu d'encapsuler le composant SHDocVw COM existant.

Donc, vous ne voudrez pas mettre ce code dans quoi que ce soit que vous livrez à beaucoup de gens et / ou quoi que ce soit qui devrait rester actif pour de nombreuses versions de Framework à venir ...

Autres conseils

Version C #

    /// <summary>
    /// Fires before navigation occurs in the given object (on either a window or frameset element).
    /// </summary>
    /// <param name="pDisp">Object that evaluates to the top level or frame WebBrowser object corresponding to the navigation.</param>
    /// <param name="url">String expression that evaluates to the URL to which the browser is navigating.</param>
    /// <param name="Flags">Reserved. Set to zero.</param>
    /// <param name="TargetFrameName">String expression that evaluates to the name of the frame in which the resource will be displayed, or Null if no named frame is targeted for the resource.</param>
    /// <param name="PostData">Data to send to the server if the HTTP POST transaction is being used.</param>
    /// <param name="Headers">Value that specifies the additional HTTP headers to send to the server (HTTP URLs only). The headers can specify such things as the action required of the server, the type of data being passed to the server, or a status code.</param>
    /// <param name="Cancel">Boolean value that the container can set to True to cancel the navigation operation, or to False to allow it to proceed.</param>
    private delegate void BeforeNavigate2(object pDisp, ref dynamic url, ref dynamic Flags, ref dynamic TargetFrameName, ref dynamic PostData, ref dynamic Headers, ref bool Cancel);

    private void Form1_Load(object sender, EventArgs e)
    {
        dynamic d = webBrowser1.ActiveXInstance;

        d.BeforeNavigate2 += new BeforeNavigate2((object pDisp,
            ref dynamic url,
            ref dynamic Flags,
            ref dynamic TargetFrameName,
            ref dynamic PostData,
            ref dynamic Headers,
            ref bool Cancel) => {

            // Do something with PostData
        });
    }


Version WPF C #

Conservez ce qui précède, mais remplacez-le:

    dynamic d = webBrowser1.ActiveXInstance;

avec:

    using System.Reflection;
    ...
    PropertyInfo prop = typeof(System.Windows.Controls.WebBrowser).GetProperty("ActiveXInstance", BindingFlags.NonPublic | BindingFlags.Instance);
    MethodInfo getter = prop.GetGetMethod(true);
    dynamic d = getter.Invoke(webBrowser1, null);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top