【发布时间】:2010-10-25 23:54:56
【问题描述】:
有什么方法可以在我不知道的 Web 浏览器控件中检测 302 重定向?也许某种底层非托管控件的魔法?
【问题讨论】:
标签: winforms webbrowser-control
有什么方法可以在我不知道的 Web 浏览器控件中检测 302 重定向?也许某种底层非托管控件的魔法?
【问题讨论】:
标签: winforms webbrowser-control
不,使用普通的 WebBrowser 控件是不可能的。用底层的非托管控件做任何事情看起来都非常复杂,如果这是你想要的,你可以看看 http://www.codeproject.com/KB/miscctrl/csEXWB.aspx 虽然:
csEXWB 是一个 C# .NET 2.0 控件 创建,托管和接收事件 原来的 Webbrowser 控件(不是 .NET 或任何其他包装器)。先进的 定制和完全控制 Webbrowser控件都实现了 通过实施一些 接口,以及添加 许多方法、属性、事件和一个 COM 库。
这包括能够查看页眉,这是您检测 HTTP 重定向所需要做的。
【讨论】:
我能够在 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
【讨论】:
我找到了一个很好的解决方法... 您可以做的是捕获/重载 webbrowser.OnNavigating 和 OnNavigated 事件。
通常在导航时同时调用 OnNavigating 和 OnNavigated 事件。 但是,无论何时发生重定向,都会调用 OnNavigated,但不会调用 OnNavigating 事件。
所以基本上我使用的是在 OnNavigating 事件中重置为 0 的计数器。 在 OnNavigating 中,我将计数器增加 1。
在 OnDocumentCompleted 事件中,我将检查计数器: 如果 counter == 1,则不发生重定向 如果 counter> 1,则发生了重定向。
到目前为止,这个技巧似乎对我有用。
【讨论】:
使用 WPF 中的 WebBrowser 控件,您可以查找 Navigating 事件。这不会为您提供状态代码,但您可以看到 Web 浏览器重定向到的 URL,因此应该能够确定何时发生重定向。我对 WinForms 不是很熟悉,但它可能以类似的方式工作。
private void Browser_Navigating(object sender, NavigatingCancelEventArgs e)
{
System.Diagnostics.Trace.WriteLine(e.Uri);
}
【讨论】: