模拟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
运行外观:
简单的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
运行外观:
![](http://images.cnblogs.com/cnblogs_com/chinasf/snap.jpg)
相关文章推荐
- ireport超链接支持js事件简单实现 兼容火狐谷歌IE等浏览器
- JS简单实现点击复制链接的方法
- js 本地预览的简单实现方法
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- js实现web套打功能,支持拖动布局,支持按键移动支持打印预览,结果可保存至数据库中
- 模仿微信朋友圈 仿微信js-sdk wx.previewImage javascript实现,支持图片预览,滑动切换,双指缩放,图片缓存 h5 html5 js
- js实现目录链接,内容跟着目录滚动显示的简单实例
- [原](源码)JS OOP 实现页面浮动图片,支持多图同时浮动,简单调用
- js 实现图片预览功能支持ie8
- js 本地预览的简单实现方法
- 微信公众号开发《四》使用微信JS-SDK实现手机图片上传,支持压缩、预览。并下载图片到自身服务器
- 简单的服务器 实现引用css、js和a链接可以跳转
- 简单实现JS上传图片预览功能
- JS简单实现点击复制链接的方法
- 简单实现JS上传图片预览功能
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- 简单解决——使用Clipboard实现剪切板,用require引入js资源,会报错Clipboard is not defined的问题
- 在ie8上js实现简单的combobox功能(支持拼音检索)
- js+jq实现图片预览,支持到ie9+ff+chrome
- JS简单实现多图片预览上传