WinForms WebBrowser控件检测重定向

3

有没有办法在Web浏览器控件内检测302重定向,这是我不知道的?也许可以使用底层未管理的控件进行某种神奇操作?

4个回答

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

似乎没有这样的事件(NavigateError)。 - pm100
NavigateError是在IE6中添加的。https://msdn.microsoft.com/zh-cn/library/bb268221(v=vs.85).aspx - Derek Johnson
对于C#,从WebBrowser派生一个类,该类添加了OLE DWebBrowserEvents2接口的NavigateComplete2和NavigateError事件。 以下是添加NavigateError事件的示例代码: https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.createsink?view=netframework-4.7 - Derek Johnson
对我来说,IE11在重定向时没有触发NavigateError :-( - Paul B.

2
不,使用普通的WebBrowser控件是不可能实现的。如果您想要使用底层的非托管控件进行任何操作,看起来会非常复杂。但您可以尝试查看http://www.codeproject.com/KB/miscctrl/csEXWB.aspx这个链接:

csEXWB是一个C# .NET 2.0控件,它创建、托管并接收原始Webbrowser控件(不是.NET或任何其他包装器)的事件。通过实现多个接口、添加许多方法、属性、事件和COM库,可以实现高级定制和对Webbrowser控件的完全控制。

这包括能够查看页面标头,这就是检测HTTP重定向所需的功能。


1
csEXWB需要大量的工作来更新。它在VS2010或更高版本中无法编译,并且存在多个错误(请参见CodeProject评论)。从头开始可能更容易。请查看我在@Derek Wade解决方案下的评论以获取一种方法。出于这些原因,我已经对此答案进行了反对投票并支持他的答案。 - Derek Johnson

0

我找到了一个不错的解决方法... 你可以捕获/重载webbrowser.OnNavigating和OnNavigated事件。

通常情况下,当导航时,OnNavigating和OnNavigated事件都会被调用。 然而,每当发生重定向时,OnNavigated被调用,但OnNavigating事件不会被调用。

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

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

到目前为止,这个技巧对我来说似乎很有效。


你如何检测导航完成?在我的情况下,有时会有两个,有时会有三个重定向(全部都是状态码301和302)。 - phse

-1
使用WPF中的WebBrowser控件,您可以查找Navigating事件。这不会给您状态代码,但是您可以看到Web浏览器重定向到的URL,因此应该能够弄清楚何时发生重定向。我对WinForms不是很熟悉,但它可能以类似的方式工作。
private void Browser_Navigating(object sender, NavigatingCancelEventArgs e)
{
    System.Diagnostics.Trace.WriteLine(e.Uri);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接