模拟Snap.com,支持js引入对链接预览的简单实现

    在前天的POST中,实现了通过IViewObject接口截浏览器的图象的类,今天改善了一下,修正了内部的资源释放问题。并且完善了WebPageSnapshot类,将目标页面的错误对话框和新窗口问题处理了一下。总之抓图速度过慢,还想不出什么改善的办法;Kai.Ma在它的代码中实现了一个很好的改善速度的办法,就是把抓的图直接存盘,只是还缺少一个更新机制,所以我在此基础上增加了一个Hashtable,它的key 存放原始url,value 保存抓取的时间,当产生抓取请求的时候,先访问该hashtable,如果不存在则记录一笔,否则就比较一下时间,是否超过1天,超过的话继续抓取,否则直接传递上次抓取的图象文件,为了简单,该hashtable未持久化处理。

简单的cache机制:

简单CACHE机制的实现


通过google搜索到一个脚本提示的实现代码,简单的改了改,将行为模拟成snap.com 提供的服务那样,把鼠标指到超级链接并停顿1秒后,显

示目标PAGE的图象。js脚本我只做了微小的调整,原作者我无法得知,比较遗憾。
有了前端JS的实现,那么后端与脚本之间的接口也很简单。

后端Snap_Preview.aspx页面只接收2个参数,分别为: href 和 domain

domain 是指当传递的url只是相对地址的时候,整合为完整地址。
href 则就是目标页的地址。

在snap_preview.aspx页的 Load 事件内写入:

    protected void Page_Load(object sender, EventArgs e)
    
{
        
///清空缓冲
        Response.Clear();
        
///目标地址
        string href = Request["href"];
        
///调用页域名称
        string domain = Request["domain"];
        
///是否显示空白页
        if (string.IsNullOrEmpty(href) || href.Equals("about:blank", StringComparison.CurrentCultureIgnoreCase))
        
{
            Response.TransmitFile(
                HttpContext.Current.Request.PhysicalApplicationPath 
+ "Caches\\loading.gif" 
            );
            
return;
        }

        
///处理url的简单办法
        if (href.IndexOf("http://"== -1)
            
if (!string.IsNullOrEmpty(domain))
                href 
= domain.TrimEnd('/'+ "/" + href;

        
if (href.IndexOf("http://"== -1)
            href 
= "http://" + href;

        
///传送图象
        Response.TransmitFile(SnapPreviewCache.CreateSnapPreviewFile(href));

    }

这样通过脚本代码的整合,即可简单的做成一个snap.com的功能雏形,不过它有很多的问题。其中最主要的就是速度慢的问题。

速度慢主要因为WebBrowser 的运行方式是;单线程单元模型 (STA):进程中一个或多个线程使用 COM ,并且 COM 对象的调用由 COM 进行同

步。在线程间对接口进行编组。单线程单元模型的退化情况(其中,在给定的进程中只有一个线程使用 COM)被称为单线程模型。以前的

Microsoft 信息与文档曾经将 STA 模型简单地称为“单元模型”。 它的运行线程应该是消息或用户界面 (UI) 线程。

而被封装到 web 组件里来隐含调用,则必须为它开辟一个STA线程,这样使它的性能大大降低,因为多次构造对象和释放对象都是非常浪费资

源的事情,初始化的速度太慢,是影响速度的最大原因。

另外,我将这次的工程代码全部发放出来,供各位研究,能有所改善则更好,也希望各位能发扬知识共享精神,让大家共同进步。

工程代码下载(含全部源码),可能有bug若干:
测试运行之前请确认Snap_Preview_Anywhere.js中的sServiceUrlRoot变量指向的是正确的地址。
/Files/Chinasf/SnapLibrary_With_WEB.rar

运行外观:

posted @ 2006-12-27 15:24  suifei  阅读(4008)  评论(10编辑  收藏  举报