Web浏览器控件崩溃

时间:2012-02-24 17:58:25

标签: asp.net

我有一个Web浏览器对象,我可以截取屏幕截图。代码可以在这里找到:http://www.vbknowledgebase.com/?Id=65&Desc=Convert-Web-Page-or-Html-to-Image(我稍微修改了一下)。

看来,如果我在本地部署应用程序,然后尝试捕获本地页面的屏幕截图,例如http://localhost/localpage,程序挂起并且不会生成屏幕截图。但是,如果我在本地部署应用程序并尝试生成外部网站的屏幕截图,例如http://www.google.co.uk,它完美无缺。

起初我虽然这是STA(单线程公寓)的问题,所以我发布了一个关于线程的问题,但现在我不太确定。请求本地页面的Web浏览器对象是否有任何问题?我在MSDN上看过,但在这里找不到任何结论。

以下是完整代码:

“ImageFromHTML.vb

Imports Microsoft.VisualBasic
Imports System.Threading
Imports System.Drawing
Imports System.Windows.Forms

Public Class ImageFromHtml
    Private PageUrl As String = "http://localhost/Default2.aspx"
    Private ConvertedImage As Bitmap

    Private m_intHeight As Integer = 1000
    Public Property Height() As Integer
        Get
            Return m_intHeight
        End Get
        Set(ByVal value As Integer)
            m_intHeight = value
        End Set
    End Property

    Private m_intWidth As Integer = 100
    Public Property Width() As Integer
        Get
            Return m_intWidth
        End Get
        Set(ByVal value As Integer)
            m_intWidth = value
        End Set
    End Property

    Public Function ConvertPage() As Bitmap
        Me.PageUrl = PageUrl
        Dim thrCurrent As New Thread(New ThreadStart(AddressOf CreateImage))
        thrCurrent.SetApartmentState(ApartmentState.STA)
        thrCurrent.Start()
        thrCurrent.Join()
        ConvertedImage.Save("c:\Test.bmp", _
        System.Drawing.Imaging.ImageFormat.Bmp)
        Return ConvertedImage
    End Function
    Public Sub CreateImage()

        Dim BrowsePage As New WebBrowser()
        BrowsePage.ScrollBarsEnabled = False
        BrowsePage.Navigate(PageUrl)
        AddHandler BrowsePage.DocumentCompleted, AddressOf _
WebBrowser_DocumentCompleted

        While BrowsePage.ReadyState <> WebBrowserReadyState.Complete
            Application.DoEvents()
        End While
        BrowsePage.Dispose()
    End Sub

    Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As  _
WebBrowserDocumentCompletedEventArgs)
        Dim BrowsePage As WebBrowser = DirectCast(sender, WebBrowser)
        BrowsePage.ClientSize = New Size(Width, Height)
        BrowsePage.ScrollBarsEnabled = False
        ConvertedImage = New Bitmap(Width, Height)
        BrowsePage.BringToFront()
        BrowsePage.DrawToBitmap(ConvertedImage, BrowsePage.Bounds)

    End Sub

    End Class

“Default.aspx.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim obj As New ImageFromHtml()
        obj.ConvertPage()
        obj = Nothing
    End Sub

如果我将PageURL变量更改为外部网站,例如http://www.google.co.uk,它有效。它不像上面那样有用。

1 个答案:

答案 0 :(得分:0)

此处的Web控件不会崩溃,只是抛出您未使用try-catch架构捕获的错误消息。

此函数使用WebBrowser 类来读取页面并使其成为位图。

所以出于任何原因,可能是错误的端口,没有找到服务器,服务器没有返回等等,你得到一个错误,你没有处理这个错误抛出。抛出是在导航时发生的,这是来自MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.navigated.aspx

的示例
' Navigates to the given URL if it is valid.
Private Sub Navigate(ByVal address As String)

    If String.IsNullOrEmpty(address) Then Return
    If address.Equals("about:blank") Then Return
    If Not address.StartsWith("http://") And _
        Not address.StartsWith("https://") Then
        address = "http://" & address
    End If

    Try
        webBrowser1.Navigate(New Uri(address))
    Catch ex As System.UriFormatException
        Return
    End Try

End Sub

但您可以使用之前的try catch。

跟进

关注代码的这一部分

While BrowsePage.ReadyState <> WebBrowserReadyState.Complete
    Application.DoEvents()
End While

这看起来不合逻辑,因为如果网页不是从错误代码竞争,或者从不加载它,而且ReadyState是永远的东西,那么你在这里堆叠,线程永远不会结束加入其余部分!更改此代码 - 我不知道在这里告诉您什么,因为我没有这个代码来调试它,但您可以轻松地在这里放置一个断点,看看哪些代码使它永远循环。

跟进B

看看这段代码

ConvertedImage.Save("c:\Test.bmp", _
System.Drawing.Imaging.ImageFormat.Bmp)

首先是错误,安全错误代码,无论如何,池可能没有写入C盘根目录的权限。