VB.net webbrowser 自定义下载接口实现

 使用《VB.net webbrowser 如何实现自定义下载 IDownloadManager》中的控件ExtendedWebBrowser(下载控件),并扩展了NewWindow2。

使用ExtendedWebBrowser_1过程中,遇到很多问题,花了几天时间,终于解决了所有问题。

问题1:接管了下载后,发现大文件下载,主程序会阻塞。

        一开始,以为是在写文件时因为IO响应导致阻塞,改用异步写,等等...尝试,发现阻塞依然,看过《C# 用FileStream.WriteAsync 异步读文件,调用线程还是被阻塞了》等文章后,问题依然未能解决。

        最后尝试主程序不写文件(就是接管下载后,在OnDataAvailable中对接收数据不操作),不做任何操作,阻塞依然存在。阻塞会导致下载中断,而且这种情况与下载文件大小无关,即使很小几M的文件也会发生。

        苦思中,记起以前写一个延时函数时,为了不阻塞而加入了Application.DoEvents()语句,于是在最频繁操作的OnDataAvailable中加入Application.DoEvents()语句,问题终于得到完满解决。

问题2:写文件

        一开始,是主程序写文件,遇到太多麻烦,在解决问题1中,发现接管了下载后,其实IE是有在后台进程中将文件下载到IE缓冲区的,OnProgress第一次便是返回IE缓冲区中下载的文件名,于是便改用:等下载完后从IE缓冲区复制文件。(貌似IE原有下载器也是这样干的?)

问题3:对于会弹出新窗口的下载,在进行第二次下载时,没有触发下载。

        因为主程序中接管弹出窗口的Extendedwebbrowser_2一直没关闭(IE中下载窗口是立即关闭的),并且发现,在NewWindow2中将弹出下载转到Extendedwebbrowser_2触发下载时,Extendedwebbrowser_2并没有触发DocumentCompleted,估计就是这里导致第二次下载时不能触发。
       解决办法:在下载完后,Extendedwebbrowser_2加载空白页"about:blank",问题解决。
 

下面是IWebBrowserDownloadManager接口完整代码:

Imports Remotion.Dms.Clients.Windows.WebBrowserControl
Imports System.IO

Namespace MyDownloadmanager                         '定义接口,以实现接口引用 2023.10.27

   Public Class MyDownloadmanager

       Implements IWebBrowserDownloadManager

       Dim INetCacheFile As String

       '一些状态的判定(True、False),其中的一种状态(True或False)必须放在接口内进行设定,
       '不能全部都靠通过外部进程来设定,外部进程只进行其中一种状态的改变就好,否则因为轮询时间差而导致不同步引发非预期结果发生。
       '例如:AfterLoadBlank

#Region "增加属性,将接口的数据传递出去以及传进来"

#Region "可读写属性"

       Private _ContinueDownload As Boolean = True
       Public Property ContinueDownload() As Boolean

           Get

               Return _ContinueDownload

           End Get

           Set(ByVal value As Boolean)

               _ContinueDownload = value

           End Set

       End Property

       Private _DownloadDir As String = ""
       Public Property DownloadDir() As String

           Get

               Return _DownloadDir

           End Get

           Set(ByVal value As String)

               _DownloadDir = value

           End Set

       End Property

       Private _AttchmentFilename As String = ""
       Public Property AttchmentFilename() As String

           Get

               Return _AttchmentFilename

           End Get

           Set(ByVal value As String)

               _AttchmentFilename = value

           End Set

       End Property

        '对于会弹出新窗口的下载,因为程序中接管的webbrowser一直没关闭,
        ’在下载完后,需要加载一次新页(在这里加载空白页"about:blank"),
        ‘否则可能无法进行下一次下载。
       Private _AfterLoadBlank As Boolean = False
       Public Property AfterLoadBlank() As Boolean    

           Get

               Return _AfterLoadBlank

           End Get

           Set(ByVal value As Boolean)

               _AfterLoadBlank = value

           End Set

       End Property

#End Region

#Region "ReadOnly Property"

       Dim _DownloadFileName As String = ""
       Public ReadOnly Property DownloadFileName() As String

           Get

               Return _DownloadFileName

           End Get

       End Property

       Private _totalSize As Integer

       Public ReadOnly Property GetTotalSize() As Integer

           Get

               Return _totalSize

           End Get

       End Property

       Private _currentValue As Integer

       Public ReadOnly Property GetCurrentValue() As Integer

           Get

               Return _currentValue

           End Get

       End Property

       Private _success As Boolean

       Public ReadOnly Property GetSuccess() As Boolean

           Get

               Return _success

           End Get

       End Property

       Private _statusText As String

       Public ReadOnly Property GetStatusText() As String

           Get

               Return _statusText

           End Get

       End Property

       Private _isAborted As Boolean

       Public ReadOnly Property GetisAborted() As Boolean

           Get

               Return _isAborted

           End Get

       End Property

       Private _IsDownloadCompleted As Boolean = False

        '下载开始时,设置为false,下载结束或退出时,设置为True
       Public ReadOnly Property IsDownloadCompleted() As Boolean    

           Get

               Return _IsDownloadCompleted

           End Get

       End Property

       Private _OnStartDownloading As Boolean = False

        '下载开始时,设置为false,下载结束或退出时,设置为True
       Public ReadOnly Property OnStartDownloading() As Boolean    

           Get

               Return _OnStartDownloading

           End Get

       End Property

#End Region

#End Region

#Region "接口函数"

       Public Sub OnAborted() Implements Remotion.Dms.Clients.Windows.WebBrowserControl.IWebBrowserDownloadManager.OnAborted

           WriteRunLog("OnAborted")

           _isAborted = True

           _IsDownloadCompleted = True

           _OnStartDownloading = False

       End Sub

       Public Function OnDataAvailable(ByVal buffer() As Byte, ByVal bytesAvailable As Integer) As Boolean Implements Remotion.Dms.Clients.Windows.WebBrowserControl.IWebBrowserDownloadManager.OnDataAvailable

           _currentValue += bytesAvailable

            '需要加这行,否则可能下载时发生阻塞,导致下载中断,而且这种情况与下载文件大小无关,即使很小几M的文件也会发生。
           Application.DoEvents()      

           Return _ContinueDownload

       End Function

       '在下载完后,需要加载一次新页(在这里加载空白页"about:blank"),否则可能无法进行下一次下载。

       Public Sub OnDownloadCompleted(ByVal success As Boolean, ByVal statusText As String) Implements Remotion.Dms.Clients.Windows.WebBrowserControl.IWebBrowserDownloadManager.OnDownloadCompleted

           _isAborted = False

           _IsDownloadCompleted = True

           _OnStartDownloading = False

           _AfterLoadBlank = True

           _success = success

           _statusText = statusText

           _AttchmentFilename = ""

           WriteRunLog("OnDownloadCompleted:" + success.ToString + "      " + statusText)

           If success Then

               If String.IsNullOrEmpty(INetCacheFile) Then

                   WriteRunLog("没有找到IE缓冲区文件!文件 " + _DownloadFileName + " 下载失败!")

               Else

                   File.Copy(INetCacheFile, _DownloadFileName, overwrite:=True)      '从IE缓冲区复制文件

                   WriteRunLog("找到IE缓冲区文件: " + INetCacheFile + ",复制到:" + _DownloadFileName)

               End If



           End If

       End Sub

       Public Function OnProgress(ByVal currentValue As Integer, ByVal totalSize As Integer, ByVal statusText As String) As Boolean Implements Remotion.Dms.Clients.Windows.WebBrowserControl.IWebBrowserDownloadManager.OnProgress

           _totalSize = totalSize

            '从第一次OnProgress中获取下载文件名

           If String.IsNullOrEmpty(_DownloadFileName) Then      

               _DownloadFileName = MyGetFileName(statusText)

               If String.IsNullOrEmpty(_DownloadFileName) Then

                   _DownloadFileName = "TmpFile"

               End If

               If Directory.Exists(_DownloadDir) Then

                   _DownloadFileName = _DownloadDir + "\" + _DownloadFileName

               End If

           End If

           If String.IsNullOrEmpty(INetCacheFile) Then

               If InStr(statusText, "Windows\INetCache") > 0 Then  '查找IE缓冲区文件 保存路径、文件名

                   INetCacheFile = statusText

                   'WriteRunLog("OnProgress找到IE缓冲区文件: " + INetCacheFile)

               End If

           End If

           System.Windows.Forms.Application.DoEvents()

           Return _ContinueDownload

       End Function

       Public Function OnStartDownload(ByVal uri As System.Uri) As Boolean Implements Remotion.Dms.Clients.Windows.WebBrowserControl.IWebBrowserDownloadManager.OnStartDownload

           _currentValue = 0

           _OnStartDownloading = True

           _ContinueDownload = True

           _IsDownloadCompleted = False

           INetCacheFile = ""

           _DownloadFileName = ""

           WriteRunLog("OnStartDownload :" + uri.ToString)

           Return True

       End Function

       'OnStartDownload:http://115.1.115.15:9080/FrntMonitor/servlet/com.icbc.cte.cs.servlet.CSReqServlet

       '1、第一次获得文件名   OnProgress:0 totalSize:0 statusText: C:\Users\gdzs-liyh\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\0F2VEW6C\statatmdev[2].xls

       '2、第二次获得下载链接 OnProgress:3483 totalSize:0 statusText:(OnStartDownload中的网址:http://115.1.115.15:9080/FrntMonitor/servlet/com.icbc.cte.cs.servlet.CSReqServlet)

       '3483就是在这时候读取的数据大小。

       'OnProgress:3483 totalSize:0 statusText: C:\Users\gdzs-liyh\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\0F2VEW6C\statatmdev[2].xls

       'OnDataAvailable:38281  (这个就是文件的实际大小)(可能文件小,此时文件已经下载到缓存:C:\Users\gdzs-liyh\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\0F2VEW6C\statatmdev[2].xls)

       'OnProgress:38281 totalSize:0 statusText:(OnStartDownload中的网址)

       'OnDownloadCompleted

       '=================================

       'OnStartDownload :http://115.96.14.11/kjbbs/UpLoadFile/2010-7/20107214401523292.doc

       '1、第一次获得文件名   OnProgress:0 totalSize:0 statusText :http://115.96.14.11/kjbbs/UpLoadFile/2010-7/20107214401523292.doc

       '2、第二次获得下载链接 OnProgress:119296 totalSize:119296 statusText :http://115.96.14.11/kjbbs/UpLoadFile/2010-7/20107214401523292.doc

       'OnProgress:119296 totalSize:119296 statusText :C:\Users\gdzs-liyh\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\5Q44G40U\20107214401523292.doc

       'OnProgress:119296 totalSize:119296 statusText :http://115.96.14.11/kjbbs/UpLoadFile/2010-7/20107214401523292.doc

       'OnDataAvailable:119296  (可能文件小,此时文件已经下载到缓存:C:\Users\gdzs-liyh\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\0F2VEW6C\statatmdev[2].xls)

       'OnDownloadCompleted

#End Region

       Shared Sub WriteRunLog(ByVal MyMsg As String)

           'Using w As StreamWriter = File.AppendText("RunLog.txt")

           Dim w As StreamWriter

           If File.Exists("RunLog.txt") Then

               If My.Computer.FileSystem.GetFileInfo("RunLog.txt").Length > 10485760 Then  '2017.5.4 文件大于10M,清0

                   w = File.CreateText("RunLog.txt")

                   w.Write("文件大于10M,置0从头开始!")

                   w.Write(Chr(9))

               Else

                   w = File.AppendText("RunLog.txt")

               End If

           Else

               w = File.CreateText("RunLog.txt")

           End If

           w.Write(Now)

           w.Write(Chr(9))     '插入Tab键

           w.WriteLine(MyMsg)

           w.Flush()

           w.Close()

           'End Using

       End Sub

       Public Function MyGetFileName(ByVal inStr As String) As String

           '获取文件名, '文件夹名、文件名不能包含下列字符\/:*?"<>|

           Dim ss As String

           ss = System.IO.Path.GetFileName(inStr)

           Dim n = InStrRev(ss, "=")

           If n < ss.Length Then

               ss = ss.Substring(n)

           End If

           MyGetFileName = ss.Replace("\", "").Replace("/", "").Replace(":", "").Replace("*", "").Replace("?", "").Replace(Chr(34), "").Replace("<", "").Replace(">", "").Replace("|", "")

           If InStrRev(MyGetFileName, "[") > 1 And InStrRev(MyGetFileName, "[") < InStrRev(MyGetFileName, "]") Then    '将 21018102002617385797[1] 中的 [1] 去掉

               MyGetFileName = Left(MyGetFileName, InStrRev(MyGetFileName, "[") - 1) + Mid(MyGetFileName, InStrRev(MyGetFileName, "]") + 1)

           End If

           MyGetFileName = _AttchmentFilename + MyGetFileName

       End Function

   End Class

End Namespace

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VB.NET WebBrowser控件是一个可视化控件,用于在Windows应用程序中嵌入Web浏览器。它允许用户在应用程序中浏览网页,执行JavaScript代码,以及与网页进行交互。该控件基于Internet Explorer浏览器内核,因此支持IE浏览器的所有功能和特性。开发人员可以使用VB.NET编写代码来控制WebBrowser控件的行为,例如导航到指定的URL,执行JavaScript代码,以及捕获网页事件。 ### 回答2: VB.NETWebBrowser控件是一个用于显示Web内容的控件,可以被嵌入Windows应用程序中。该控件实际上是一个ActiveX控件,使用时需要在工具箱中将其拖放到窗体上。 WebBrowser控件可以加载HTML文件、XML文件、图像和视频等内容。它支持基本的浏览器功能,如前进、后退、刷新、停止等,可以在控件内部浏览网页,也可以通过代码控制浏览器行为。该控件提供了许多有用的事件,如DocumentCompleted、Navigated、Navigating等,方便开发者监测浏览器的操作。 通过WebBrowser控件,开发者可以将Web内容嵌入到自己的应用程序中,实现更加个性化的内容展示方式。例如,可以将网页嵌入到一个窗口中,通过控制浏览器行为修改网页内容或实现交互操作。此外,WebBrowser控件还可以用于Web爬虫、自动化测试等应用场景。 但是,WebBrowser控件也存在一些问题。首先,它是一个ActiveX控件,需要依赖Internet Explorer浏览器的渲染引擎,而IE浏览器的性能和安全性有一定问题。其次,WebBrowser控件的开销相对较大,使用中会占用较高的cpu和内存资源,很容易导致应用程序的性能下降。 因此,在使用WebBrowser控件时,需要权衡其功能和性能等方面的因素,根据实际需求选择是否使用。如果需要更好的性能和安全性,可以考虑使用其他浏览器内核、或者使用Web API等方式实现所需功能。 ### 回答3: VB.NET中提供了一个名为WebBrowser的控件,它允许您在应用程序中嵌入Web浏览器功能。WebBrowser控件是基于Internet Explorer的内部实现,并允许您显示和操作HTML文档和其他Web资源。 WebBrowser控件提供了一组方法和属性,可供编程使用。例如,您可以使用Navigate方法将WebBrowser导航到指定的Web页。您还可以使用WebBrowser的Document属性来访问当前加载的文档,以及它的HTML元素和文本内容。 WebBrowser控件还支持以下功能: 1.支持JavaScript脚本:当您显示包含JavaScript的Web页时,WebBrowser控件会自动执行它们。 2.支持Cookies:WebBrowser控件默认情况下可以管理并存储Cookies。这些Cookie可以用于持久存储Web站点的用户身份凭证等信息。 3.支持Zooming In/Out:WebBrowser控件提供了一组方法和属性,可让用户缩放Web页面。 4.支持浏览历史记录:WebBrowser控件提供了一个History属性,它包含当前WebBrowser的浏览历史记录,允许您在历史记录中导航。 5.支持Web浏览器事件:WebBrowser控件提供了一组事件,可以在Web文档下载,导航,缩放等各个阶段启用代码。 总之,WebBrowser控件提供了一种易于使用的方式嵌入Web浏览器功能。它可用于实现多种Web浏览器应用程序,如网页抓取器,搜索引擎,Web自动化测试和屏幕快照捕获等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值