• 模拟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

    运行外观:

  • 相关阅读:
    浅谈T-SQL中的特殊联结
    浅谈T-SQL中的联接查询
    对AccessViolationException的一些总结
    浅谈JavaScript中的定时器
    浅谈跨域
    浅谈JavaScript中的Ajax
    浅谈JavaScript中的能力检测
    c# webConfig中的session超时详细设置
    c# session总结
    重启sql server服务两种方式
  • 原文地址:https://www.cnblogs.com/Chinasf/p/605035.html
Copyright © 2020-2023  润新知