千里之行,始于足下

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

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  34 随笔 :: 0 文章 :: 188 评论 :: 10 引用

  有一个项目,基于 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 阅读(2101) 评论(16)  编辑 收藏 网摘 所属分类: 开发心得

评论

#1楼 2006-03-22 22:27 双鱼座      
如果是基于http的,总是可以得到,而asp.net正是基于http的。你无法离开http来获得服务器对你的客户端工具的认同。换句话说我可以另外再写一个docviewer来获得你的文档。
“从技术上讲没有完不成的任务”这是一句空话。如果这个任务需要100年才能完成,有意义吗?

  回复  引用  查看    

#2楼 2006-03-23 00:30 fuyude.net      
我总想得到金山词霸里面的单词解释;但是没有办法!也许这个对你有点启示 :)
  回复  引用  查看    

#3楼 2006-03-23 01:48 kaneboy[未注册用户]
“要求客户端只能浏览,但不允许保存”,如果客户有这个需求,我觉得应该更深入的和客户交流,了解他们为什么有这个奇怪的需求。

我猜测客户的真正需求应该是,希望系统的用户只能在线阅读这些文档,而不允许传播出去(这才是不允许保存到本地的真正目的)。

个人认为满足这个需求的更合适方案是RMS,Rights Management Services。

  回复  引用    

#4楼 2006-03-23 08:02       
既然都需要一次安装,为何不直接使用ActiveX技术呢?
说实在的,能在IE显示显示的,除了AcitveX外,其它的内容都可以保存!!!
只要开发一个IE的二次显示控件,就可在获取文档完整的内容;只要文档是用Html标签标识的。 当然,会做这事的可能不多

  回复  引用  查看    

#5楼 2006-03-23 08:52 benyu[未注册用户]
截屏一下,搞了几天的不都没用了?
  回复  引用    

#6楼 2006-03-23 09:02 Riancy[未注册用户]
@benyu
javascript有个函数可以清空复制区内存的,即使你截屏也马上清空了,只要你打开了你想要截屏的网页

  回复  引用    

#7楼 2006-03-23 09:22 smalldust      
@双鱼座
的确从理论角度上讲,没有破解不了的程序。
但是,他们头的“从技术上讲没有完不成的任务”这句话,其实是完全正确的。
也就是说,无论客户有什么样稀奇古怪的要求,SE总可以绕过技术问题去解决它。
SE是一个通常不正面与困难交战的种族。SE要解决的是客户的需求,不是技术问题。

@kaneboy
这个需求一点也不奇怪。试想你是一个完全不懂技术的人,
你为员工提供一些文档,又由于某些保密的希望,不想让他们复制、外传,
当然就提出“只能浏览不能下载”的要求了。超星的数字图书馆不也是吗?
作为SE深入了解客户的需求是应该的,但是不能去质疑客户为什么有这么“奇怪”的需求。

  回复  引用  查看    

#8楼 2006-03-23 09:42 双鱼座      
@smalldust
呵呵。过后想了一下,我说“‘从技术上讲没有完不成的任务’是一句空话”其实是错误的,正确的说法是:“‘从技术上讲没有完不成的任务’是一句自相矛盾的话”。
“建立一个无法被攻破的堡垒”是一个任务;“建立一个无坚不摧的破解武器”是另外一个任务。你觉得哪个任务是“从技术上讲没有完不成的”?
另外,质疑客户为什么会有这样的“奇怪”的需求才是需求分析师或者项目经理良好的习惯。需求分析的过程肯定是从What到Why然后才能到How。这个“奇怪”意味着有点不同寻常,并不是说不合理,更不是说错误。你明白这些个不同的概念吗?

  回复  引用  查看    

#9楼 2006-03-23 09:45 ff[未注册用户]
从技术上来讲,没有完不成的任务
这句话是无知的,BOSS他怎么不让下面的人搞出个象MS一样的技术呢??
ms的技术也是人们所需要的啊!!!

有些通过技术不能实现的客户需求,只能绕过技术于回实现,但这样给客户带来很烦索的操作。

  回复  引用    

#10楼[楼主] 2006-03-23 10:12 sunwaywei      
呵呵,没想到一句话引起这么多的争论。

没有完不成的任务,这句话要看怎么理解。许多时候,我们从正面解决一些问题往往是非常复杂,甚至可能是付出巨大代价而没有什么回报的,碰到这种情况,作为商业开发来说,我们总是试图绕开它,并且基本上可以说,我们总是可以绕开它。BOSS是这样的意思。

客户的要求其实就是类似于超星数字图书馆,可以浏览,可以打印,也可以截屏,但是无法用文本啊、Word啊之类的格式来保存,或者直观的说就是无法传播、无法二次使用,除非用户愿意将成百上千页的文档一个个截屏。我们相关的文档不是HTML格式,而是二进制的。我们曾考虑过转换成HTML,但最后我们认为是不现实,也是不值得的的。

  回复  引用  查看    

#11楼[楼主] 2006-03-23 10:17 sunwaywei      
@kaneboy

RMS,Rights Management Services。我还不太了解,有空我会去看一看,谢谢指教。

我们做这个东西目前更多的是实验性质。因为客户也不知道它能否起到预想的作用,如果下一步证明大有可为,或许整个项目我们会重新构思设计。

  回复  引用  查看    

我用屏幕纪录器,可以把内容全部纪录下来。这个要求变成为没有意义的要求,
我还可以用相机照下来。。。。。。
如果没有经过加密,我还可以拦截数据。
总之是有办法的。

  回复  引用    

#13楼 2006-03-23 12:19 gozh2002
My two cents...

what if you convert it to pdf format... I remember you can actually encrypt the pdf document, which won't allow you save and print, also you can't select the text...


  回复  引用    

#14楼[楼主] 2006-03-23 12:27 sunwaywei      
@iamsunrise
用你所说的方法当然可以了,只要你不嫌麻烦。何况我们并不是真正要求客户端完全无法获取数据,只是让获取数据没有那么容易。

@gozh2002
We do not use pdf format, for it is used widely. What we used is a binary document format defined by outselves.

  回复  引用  查看    

哎呀,我也遇到这个问题,不好实现,有想法却也无法操作,技术有瓶景
  回复  引用    

#16楼 2009-02-10 12:28 ξσ Dicky σξ      
楼主,偶 有个需求,跟你的接近,能帮偶看看怎么解决吗?

点网站中的一个文件链接,自动调用客户端机器上装的软件打开,就像直接点本地文件中的文件名字一样,比如打开一个.doc的超链接,那么就调用word打开,.avi则调用播放器打开(如果装了多个播放器,通常应该是系统中最后装的播放器软件打开),.jpg的则调用acdsee或其他看图软件打开,以此类推。总之不能点了超链接出现提示下载,另存为的对话框。

  回复  引用  查看    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 356185




相关文章:

相关链接: