您的位置:首页 > Web前端 > JavaScript

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

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

简单的cache机制:

using System;
using System.Web;
using System.Web.Caching;
using System.Web.Security;
using System.Text;
using SnapLibrary;
using System.Threading;
using System.Drawing;
using System.Collections;
using System.IO;

public static class SnapPreviewCache

class SnapPreviewFileParam
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

运行外观:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: