有没有办法在Web浏览器控件内检测302重定向,这是我不知道的?也许可以使用底层未管理的控件进行某种神奇操作?
有没有办法在Web浏览器控件内检测302重定向,这是我不知道的?也许可以使用底层未管理的控件进行某种神奇操作?
我能在NavigateError事件中检测到重定向。状态码将是301或302。我设置了一个标志表示将要进行重定向。然后在navigatecomplete2事件中,URL就是重定向的URL。在该事件处理程序中,我检查我的重定向标志,如果为真,则清除重定向标志并再次导航到新的URL。这对于多个重定向应该有效。这是VB6代码,但理论上适用于任何WebBrowser实现。
Dim m_isRedirected as boolean
...
Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
If m_isRedirected Then
m_isRedirected = False 'clear the flag in case another redirect occurs
WebBrowser1.Navigate2 URL
End If
End Sub
Private Sub WebBrowser1_NavigateError(ByVal pDisp As Object, URL As Variant, Frame As Variant, StatusCode As Variant, Cancel As Boolean)
If StatusCode = 301 Or StatusCode = 302 Then m_isRedirected = True
End Sub
csEXWB是一个C# .NET 2.0控件,它创建、托管并接收原始Webbrowser控件(不是.NET或任何其他包装器)的事件。通过实现多个接口、添加许多方法、属性、事件和COM库,可以实现高级定制和对Webbrowser控件的完全控制。
这包括能够查看页面标头,这就是检测HTTP重定向所需的功能。
我找到了一个不错的解决方法... 你可以捕获/重载webbrowser.OnNavigating和OnNavigated事件。
通常情况下,当导航时,OnNavigating和OnNavigated事件都会被调用。 然而,每当发生重定向时,OnNavigated被调用,但OnNavigating事件不会被调用。
所以基本上我使用一个在OnNavigating事件中重置为0的计数器。 在OnNavigating中,我将计数器增加1。
在OnDocumentCompleted事件中,我将检查计数器: 如果计数器== 1,则没有发生重定向 如果计数器> 1,则已发生重定向。
到目前为止,这个技巧对我来说似乎很有效。
private void Browser_Navigating(object sender, NavigatingCancelEventArgs e)
{
System.Diagnostics.Trace.WriteLine(e.Uri);
}