千里之行,始于足下

酌贪泉而觉爽,处涸辙而犹欢

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

  有一个项目,基于 asp.net 实现了一个文档管理和浏览功能,但其中有一个特殊的要求,那就是要求客户端只能浏览,但不允许保存。呵呵,没办法,既然有要求,那就得想办法实现啊。

  或许从技术上来讲,这个要求是基本不可能实现的。因为既然客户端能够浏览,必然已经把相关的数据下载到了客户端,又怎么可能不允许保存呢?我记得见过一些网页,为了防止浏览者获取数据,采取了不少方法,比如说,不允许保存,不允许选择文本拷贝而只能打印等等。不过实话说,我还没有遇到完全没有办法获取数据的网页,许多时候选一下“使用 Microsoft Word 编辑”就一切 OK 了。

  对于这个项目,由于文档格式比较特殊,想转化成 html 页面显然不值得。若要使用 ActiveX 控件呢,毕竟客户端的行为是不可控的,易用性也有所不够。和另一个人一商量,干脆还是采用桌面程序来进行浏览吧。

  我们的想法是,在页面上文档的链接是 doc://host/ 后跟一个 GUIID。GUID 是服务器用来定位文档位置的,host 自然是服务器地址,而 doc,则是需要在客户端计算机上注册的一个 URL Protocol。应该有许多人用过 eMule,它的链接就是 ed2k://... 这么一个格式,同样的,我们可以依样划葫芦地建如下这么一个注册项:

  HKEY_CLASSES_ROOT
            doc
                shell
                    open
                        command

  shell、open、command 的形式和添加文件类型的情况是一样的。但是对于 doc,它的默认值应当为 "URL: doc Protocol",再新建一个字符串值,Name 为 "URL Protocol",值为空。这样,就新注册了一个 doc 协议,当浏览器遇到 doc://... 这样的链接时,就会启动 command 里指定的程序,其 "%1" 参数将会被赋值为链接的地址。

  浏览器程序被启动后,根据 URL 里的 GUID 向服务器发出文档请求,服务器再将文档以数据流的形式返回给客户端,而客户端将数据放置在 MemoryStream 中,大体上算是实现了用户的要求,目前测试已经成功。

  要使客户端能够启动浏览器程序,自然 web 站点上要提供一个安装程序的下载。为此,再用 VS.NET 做一个 msi 安装包。除了要把浏览器程序打进安装包外,还必须建立注册表项。这里,command 的默认值应当设成 

        "[TARGETDIR]DocViewer.exe" "%1"

  起初以为应当设为 [Application Folder] 的,后来发现不对,也找不着相关资料。最后还是在 VS.NET IDE 的属性窗口下拉列表里发现了 [TARGETDIR] ,呵呵。

  安装包里有需要注册的COM DLL,只需要在对应文件的属性中,将 Register 设为 vsdrfCOMSelfReg 即可。

  吁,不知道将来还会有什么稀奇古怪的要求。不过 BOSS 讲过,从技术上来讲,没有完不成的任务,我想,兴许他是对的。

posted on 2006-03-22 21:39  sunwaywei  阅读(2797)  评论(16编辑  收藏  举报