Frage

.NET 3.5 verwendet, die hat ein WebBrowser-Steuerelement auf das

Ich habe ein Windows-Formular in Visual Studio 2008 bekam. Ich brauche die Form der Postdata im Navigating Ereignishandler zu analysieren, bevor die Anforderung gesendet wird. Gibt es eine Möglichkeit, um es zu bekommen?

Der alte win32-Browser-Steuerung hatte ein Before_Navigate Ereignis, das Postdata als eines ihrer Argumente hatte. Nicht so mit dem neuen .NET-WebBrowser-Steuerelement.

War es hilfreich?

Lösung

Diese Funktionalität wird nicht von .NET WebBrowser Kontrolle ausgesetzt. Glücklicherweise ist, dass die Kontrolle meist ein Wrapper um die ‚alte‘ Kontrolle. Dies bedeutet, dass Sie auf die BeforeNavigate2 Ereignis abonnieren Sie kennen und lieben, mit so etwas wie die folgenden (nach einen Verweis auf SHDocVw zu Ihrem Projekt hinzufügen) (?):

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

... und tun, was Sie an die Postdatum innerhalb dieses Ereignis wollen:

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

Eine wichtige Einschränkung: die Dokumentation für die WebBrowser.ActiveXInstance Eigenschaft heißt es: „Diese API die .NET Framework-Infrastruktur unterstützt und ist nicht direkt von Ihrem Code verwendet werden.“. Mit anderen Worten:. Ihre Nutzung der Immobilie kann Ihre Anwendung an jedem beliebigen Punkt in der Zukunft brechen, zum Beispiel, wenn die Menschen Rahmen entscheiden, ihre eigene Browser-Komponente zu implementieren, anstatt die vorhandenen SHDocVw COM eines Einwickelns

Also, werden Sie diesen Code nicht in etwas setzen wollen Sie eine Menge Leute und / oder etwas versenden, die für die Arbeit viele Framework-Versionen bleiben sollte zu kommen ...

Andere Tipps

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

Halten Sie die oben, aber ersetzen:

    dynamic d = webBrowser1.ActiveXInstance;

mit:

    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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top