Pergunta

Eu tenho um windows formulário no Visual Studio 2008 utilizando o .NET 3.5 que tem um controle WebBrowser nele. Eu preciso analisar PostData do formulário no manipulador de eventos Navigating antes do pedido é enviado. Existe uma maneira de chegar a ele?

O velho controle de navegador win32 teve um evento Before_Navigate que teve PostData como um de seus argumentos. Não é assim com o novo controle .NET WebBrowser.

Foi útil?

Solução

Essa funcionalidade não é exposta pelo controle .NET WebBrowser. Felizmente, esse controle é principalmente um invólucro em torno do controle de 'velho'. Isto significa que você pode se inscrever para o evento BeforeNavigate2 você conhece e ama usando algo como o seguinte (depois de adicionar uma referência para SHDocVw ao seu projeto) (?):

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

... e fazer o que quiser com a PostData dentro desse 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

Uma ressalva importante: a para o propriedade WebBrowser.ActiveXInstance afirma que "Esta API oferece suporte à infraestrutura .NET Framework e não se destina a ser usado diretamente em seu código.". Em outras palavras:. O uso da propriedade pode quebrar a sua aplicação a qualquer momento no futuro, por exemplo, quando as pessoas Framework decidir implementar seu próprio componente de navegador, em vez de envolver o SHDocVw COM existente

Então, você não quer colocar esse código em qualquer coisa que você enviar para um monte de pessoas e / ou qualquer coisa que deve permanecer trabalhando para muitas versões Framework para vir ...

Outras dicas

C # versão

    /// <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 versão

Mantenha o acima, mas substitua:

    dynamic d = webBrowser1.ActiveXInstance;

com:

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top