如何从WebBrowser.Navigating事件处理程序访问PostData?

时间:2020-03-06 14:48:18  来源:igfitidea点击:

我在使用.NET 3.5的Visual Studio 2008中有一个Windows窗体,上面带有WebBrowser控件。在发送请求之前,我需要在Navigating事件处理程序中分析表单的PostData。有没有办法做到这一点?

旧的win32浏览器控件有一个Before_Navigate事件,该事件以PostData作为其参数之一。新的.NET WebBrowser控件并非如此。

解决方案

.NET WebBrowser控件未公开该功能。幸运的是,该控件主要是"旧"控件的包装。这意味着我们可以使用类似于以下内容的方式(在对项目添加对SHDocVw的引用之后)来订阅我们认识并喜欢的BeforeNavigate2事件:

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

...并对事件中的PostData做任何我们想做的事情:

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

一个重要的警告:WebBrowser.ActiveXInstance属性的文档指出:"此API支持.NET Framework基础结构,不能直接在代码中使用。"。换句话说:我们对该属性的使用可能会在将来的任何时候中断应用程序,例如,当Framework人员决定实现自己的浏览器组件时,而不是将现有的SHDocVw COM封装为一个组件时。

因此,我们不希望将此代码放入很多人可以使用的代码中,并且/或者对于将来要使用的许多Framework版本都应该可以使用的代码...