Pregunta

Tengo un formulario de Windows en Visual Studio 2008 usando .NET 3.5 que tiene un control WebBrowser. Necesito analizar los PostData del formulario en el controlador de eventos de Navegación antes de enviar la solicitud. ¿Hay una manera de llegar a ella?

El antiguo control del navegador win32 tenía un evento Before_Navigate que tenía PostData como uno de sus argumentos. No es así con el nuevo control .NET WebBrowser.

¿Fue útil?

Solución

Esa funcionalidad no está expuesta por el control .NET WebBrowser. Afortunadamente, ese control es principalmente una envoltura alrededor del control "antiguo". Esto significa que puedes suscribirte al evento BeforeNavigate2 que conoces y te encanta (?) Utilizando algo como lo siguiente (después de agregar una referencia a SHDocVw a tu proyecto):

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

... y haz lo que quieras con PostData dentro de ese evento:

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

Una advertencia importante: la documentación para la La propiedad WebBrowser.ActiveXInstance indica que " Esta API es compatible con la infraestructura de .NET Framework y no está diseñada para ser utilizada directamente desde su código. & Quot ;. En otras palabras: su uso de la propiedad puede interrumpir su aplicación en cualquier momento en el futuro, por ejemplo, cuando la gente de Framework decida implementar su propio componente de navegador, en lugar de envolver uno de SHDocVw COM existente.

Por lo tanto, no querrá poner este código en cualquier cosa que envíe a muchas personas y / o cualquier cosa que debería seguir funcionando para muchas versiones de Framework que se avecinan ...

Otros consejos

C # version

    /// <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
        });
    }


C # WPF version

Guarda lo anterior, pero reemplaza:

    dynamic d = webBrowser1.ActiveXInstance;

con:

    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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top