【问题标题】:WinForms WebBrowser control detect redirectionsWinForms WebBrowser 控件检测重定向
【发布时间】:2010-10-25 23:54:56
【问题描述】:

有什么方法可以在我不知道的 Web 浏览器控件中检测 302 重定向?也许某种底层非托管控件的魔法?

【问题讨论】:

    标签: winforms webbrowser-control


    【解决方案1】:

    不,使用普通的 WebBrowser 控件是不可能的。用底层的非托管控件做任何事情看起来都非常复杂,如果这是你想要的,你可以看看 http://www.codeproject.com/KB/miscctrl/csEXWB.aspx 虽然:

    csEXWB 是一个 C# .NET 2.0 控件 创建,托管和接收事件 原来的 Webbrowser 控件(不是 .NET 或任何其他包装器)。先进的 定制和完全控制 Webbrowser控件都实现了 通过实施一些 接口,以及添加 许多方法、属性、事件和一个 COM 库。

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

    【讨论】:

    • csEXWB 需要大量工作才能更新。它不能在 VS2010 或更高版本中编译,并且有几个错误(请参阅 CodeProject cmets。)。从头开始可能更容易。有关方法,请参阅下面@Derek Wade 解决方案中的我的 cmets。由于这些原因,我对这个答案投了反对票,对他的答案投了赞成票。
    【解决方案2】:

    我能够在 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
    

    【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 您如何检测到导航已完成?在我的情况下,有时有两个,有时是三个重定向(状态均为 301 和 302)。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多