WinForms WebBrowser控件检测重定向

时间:2010-10-25 23:54:57

标签: winforms webbrowser-control

有没有办法检测我不知道的网页浏览器控件中的302重定向?也许某种神奇的潜在的非管理控制?

4 个答案:

答案 0 :(得分:2)

我能够检测到NavigateError事件中的重定向。状态代码将为301或302.我设置了一个重定向发生的标志。然后在navigatecomplete2事件中,URL是重定向URL。在该事件处理程序中,我检查我的重定向标志,如果为true,则清除重定向标志并再次导航到新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

答案 1 :(得分:1)

不,使用普通的WebBrowser控件是不可能的。对底层非托管控件执行任何操作都非常复杂,如果这是您可以查看之后的内容 http://www.codeproject.com/KB/miscctrl/csEXWB.aspx虽然:

  

csEXWB是一个C#.NET 2.0控件   创造,主持和沉沦事件   原始的Webbrowser控件(不是   .NET或任何其他包装器)。高级   定制和完全控制   实现了Web浏览器控件   通过实施一些   接口,以及添加   许多方法,属性,事件和a   COM库。

这包括能够查看页眉,这是检测HTTP重定向所需要做的。

答案 2 :(得分:0)

我发现了一个很好的解决方法...... 你可以做的是捕获/重载webbrowser.OnNavigating和OnNavigated事件。

通常在导航OnNavigating和OnNavigated事件时都会被调用。 但是,无论何时发生重定向,都会调用OnNavigated,但不会调用OnNavigating事件。

所以基本上我正在使用一个在OnNavigating事件中重置为0的计数器。 在OnNavigating我将计数器增加1。

在OnDocumentCompleted事件中,我将检查计数器: 如果counter == 1,则不会发生重定向 如果反击> 1,重定向已经发生。

到目前为止,这个技巧似乎对我有用。

答案 3 :(得分:-1)

在WPF中使用WebBrowser控件,您可以查找导航事件。这不会提供状态代码,但您可以看到Web浏览器重定向到的URL,因此应该能够找出重定向何时发生。我对WinForms并不熟悉,但它可能会以类似的方式工作。

private void Browser_Navigating(object sender, NavigatingCancelEventArgs e)
{
    System.Diagnostics.Trace.WriteLine(e.Uri);
}