因为我的博客有人向我反应出现这样的问题,所以在网上搜了一下原因。
最近参与一个虚拟社区的项目,我制作了其中的农场游戏和视频会议应用模块,整个项目有多个Flex Project,包括主程、公共库、各个功能模块等。因为我参与的比较晚,对该项目的开发模式不是很了解,当然也因为我做的那两个应用独立性较强,所以我使用的独立的Flex Project来构建了那两个应用。
项目使用的是RSL(Runtime shared library)来链接外部库,所以我在做那两个应用的时候同样使用了RSL,初期一切正常,项目上线后,客服人员偶尔会收到客户的电话说打不开农场的情况,农场的位置出现“RSL Error 1 of 1”,在下方有一段文字“Error #2032: 流错误。 URL: http://www.xxx.com/XXX.swf/[[DYNAMIC]]/framework_3.2.0.3958.swf”。
出现这个问题的一段时间,我都比较困惑,当时自己找到了该问题的原因,并想到了一个解决方案。
先简单介绍一下RSL,RSL说白了是把多个Project创建类编译到多个swf中,这里面包括类库项目、Flex的框架库(framework_xxx.swf),这样就可以把这些swf中包含的类进行多个项目共享,在客户端加载的时候只需要加载一份就可以了(如果不使用RSL,所有用到的类会编译进一个swf中,如果有多个这样的swf,每个里面都包含一部分重复的类,增加了用户的下载量)。只有一个Project的情况下,使用RSL的效果并不明显,因为生成的swf对于所有用到的其他swf共享库都需要加载;而如果有多个Project,优势就会显现出来,第一个swf加载完成共享库后,之后的swf就不需要再加载了,可以提高访问速度。
使用RSL后,在生成的项目根目录下会有两个framework文件“framework_3.2.0.3958.swz”和“framework_3.2.0.3958.swf”(使用不同的Flex SDK,这两个framework文件后面的版本号会不同),客户端在访问主程时,会首先加载framework.swz文件,然后Flash Player把这个框架文件保存到Flash缓存中,如果framework.swz文件加载失败,则Flash Player会去找framework.swf文件,两个有一个加载成功,则项目就可以正确运行。
在出现“RSL Error”错误后,我尝试在自己的电脑上重现该错误,操作系统使用的是XP,当我把Flash Player缓存中的swz文件删掉,并新建了一个空的只读的swz文件,名字与刚删掉的swz文件同名,再次运行项目,果然出现了“RSL Error”,如下图,因为Flash Player向缓存中写入新的framework.swz时失败了,同时framework.swf也加载失败了。当时解决该问题的方法是手工向客户机的Flash Player缓存中保存framework.swz文件,至于该文件为什么在客户机的电脑上没有成功加载,没有多考虑(当时想或许是权限问题吧),只是在论坛上发个帖子看有没有人遇到类似的问题。
每个人都有懒惰的一面,我当时正是如此,如果仔细考虑一下,至少存在两个应该去深究的问题:1、整个项目项目都是使用的RSL,为什么只有我写的这两个应用出现RSL错误,我写的应用与整个项目有什么不同;2、我的应用在framework.swz加载失败后,framework.swf也加载失败,所以不能运行,整个项目在swz加载失败后,但可以运行,后来查看,IE缓存中确实存在framework.swf,那么这个可以肯定是整个项目文件加载的framework.swf。
一段时间,在论坛上的提问没有人确切给出这个问题的解决方案。再一次让我深究这个问题是帮助一个客户解决农场无法打开,也就是出现了“RSL Error”。 客户的计算机是Vista系统和IE8浏览器,我把RSL用到的framework.swz放到客户机的Flash缓存中时突然想到会不会是因为操作系统的原因而引起的呢?我们开发使用的都是XP系统。因为客户机的Flash缓存中没有swz文件,也就是之前的访问根本没有成功加载这个swz。
我在虚拟机上装了win7来做测试(win7与Vista内核一样),果然在win7下无法正常访问农场,Flash缓存中无swz文件。因为这个项目的其他模块都可以正常访问,所以我觉得framework.swf文件应该是成功加载了,但当我打开IE缓存时,发现IE缓存中竟然是framework.swz,颇为惊讶,如下图,因为之前一直以为这个swz框架文件会被保存到Flash的缓存中,不曾想在win7系统下会被放到IE缓存中(我的Flash Player版本是10.0.45),这就是为什么在Flash缓存中没有swz框架文件的原因。(如果framework.swz放到Flash缓存中,可以让多个域下的swf共享,而如果在IE缓存中,就只能是同一个域下的swf共享)。
发现这点无疑让我对RSL错误有更进一步了解,可能这是Flash Player的一个bug吧,也可能是微软给adobe做的手脚哈,当然这个暂时不能得到证实。
问题到这当然还不能结尾,因为我们还有疑问:framework.swz加载失败,还有framework.swf可以选择啊,为什么这个第二选择也失败了呢,我使用火狐浏览器HttpFox插件来查看客户端向服务器端的请求,终于找到了问题的所在,并且得出第二个问题 framework.swf加载失败与操作系统无关。问题的原因总结一句话“加载外部使用了RSL的swf文件,会造成该外部swf所指向的framework文件路径错误”。
使用火狐浏览,并打开HttpFox插件来查看Http请求,在加载完主程时,可以检测到客户端请求了framework.swz文件(如果swz无法加载则会加载framework.swf文件),当我禁用掉swz文件的加载后,进入到农场,发现农场重新加载framework.swz和framework.swf,但这两个文件都加载失败了,下面的两张图第一张是主程成功加载framework.swz,第二张显示农场加载的framework文件路径是错误的。
问题已经很清晰了,农场是一个单独的Project并使用了RSL,并且是使用Loader加载到主程中的,看上去好像这种方式改变了农场程序的URL路径,但农场用到的资源路径却没有改变。那么得出的结论应该是只改变了这个应用所用到的framework文件路径,这个路径只有在Flash Player使用,不知道有没有别的地方可以设置,这算不算又是一个Flash Player的bug呢?
有机会希望能进一步研究RSL。
PS:这篇文章之前忘了写解决方案了,目前我知道的有两种方案,一就是不使用RSL了,当然这样就享受不到RSL带来的好处;二是手工向客户端拷贝flashplayer缓存文件,此方式的缺陷是有时候我们无法操作客户机。对于第二种方式,flashplayer的缓存目录是:XP系统下是C:\Documents and Settings\用户名\Application Data\Adobe\Flash Player\AssetCache\H7UC3H3Y,VISTA和WIN7系统下是C:\Users\用户名\AppData\Roaming\Adobe\Flash Player\AssetCache\RAU4Y963,这两个路径的最后一个文件夹名是随机的,另外拷贝过去的swz文件也需注意,比如FlexSDK3.2在缓存中的swz文件名是1C04C61346A1FA3139A37D860ED92632AA13DECF.swz,这个文件需要从一个有flashplayer缓存的机子上拷贝到有问题的机子上去。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zlxluofeng/archive/2010/04/29/5543811.aspx
分享到:
相关推荐
Remote Serial Link (RSL) Protocol Interface Standard
RSL类库文件及说明文档
OTIS-RSL远程串行接口协议标准大全.PDF
OTIS-RSL串行协议-中文版。 文档描述了远程串行接口协议标准在奥地斯电梯系统中的应用,该文档在使 用远程串行接口协议标准进行通讯的建模过程提供了参考。对于多个模块的标准 接口定义有参考作用,但是获取不了有些...
RSL10-SENSE-DB-GEVB_GERBER
RSL5K_V19.00_Core 用于程序开发,编程。
OTIS-RSL串行协议-中文版。 文档描述了远程串行接口协议标准在奥地斯电梯系统中的应用,该文档在使 用远程串行接口协议标准进行通讯的建模过程提供了参考。对于多个模块的标准 接口定义有参考作用,但是获取不了...
The RSL10 Sensor Beacon application allows the monitoring of various sensors connected to energy harvesting based RSL10 development platforms. It supports all available On Semiconductor Beacon ...
AB PLC RSL5KV11_V12_13-17rar,AB PLC RSL5KV11_V12_13-17
避免Flex RSL重复load 提高module加载性能的swc
一个简单的应用程序,用于演示 onsemi RSL10/RSL15 蓝牙低功耗设备的无线固件 (FOTA)。 RSL10 和 RSL15 是来自 onsemi 的超低功耗蓝牙低功耗无线微控制器。 FOTA 应用程序充当中央设备来扫描、连接固件映像并将其...
RSL15DOCUMENTATIONPACKAGE.ZIP
他是C语言写的程序集包含了属性约减、属性值约减等诸多算法
RSL10蓝牙单芯片(SoC) 安森美半导体.pdf
施耐德继电器Zelio Relay RSL薄片式pdf,施耐德继电器Zelio Relay RSL薄片式:RSL 薄片式继电器拥有紧凑的外观和模块化设计的优点:纤薄的宽度(6mm)在控制柜导轨上安装时节省了空间。
RSL10 射频测试,使用到的RF Tool以及DUT端固件以及源码
安森美半导体(ON Semiconductor)推出RSL10传感器开发套件,旨在为工程团队提供一个具备智能传感器...还含1个超低噪声数字麦克风,及1个用户可编程的RGB LED、3个可编程按钮开关和64 kbit EEPROM。 Bosch Sensortec
在发现斜坡中存在水之后,最近的关注点已放在循环斜坡线(RSL)上。 假定RSL是由于流动的水引起的。 但是,即使可能是这样,RSL的一般特征以及其在火星中的季节和空间分布以及在火山口内的发生也表明RSL对应于冷冻含...
是的matlab代码RSL助手 通过染料 小心!!!! PLARIUM当前删除了Mercy系统信息危险!!!! PLARIUM当前删除了有关怜悯系统的信息 这是Dye精心开发的免费工具, 这应该有助于接管Raid Shadow Legends中的某些任务。 ...
安森美半导体推出RSL10传感器开发套件.pdf