"RSL Error 1 of 1"问题剖析

最近参与一个虚拟社区的项目,我制作了其中的农场游戏和视频会议应用模块,整个项目有多个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文件,至于该文件为什么在客户机的电脑上没有成功加载,没有多考虑(当时想或许是权限问题吧),只是在论坛上发个帖子看有没有人遇到类似的问题。

"RSL Error 1 of 1"问题剖析_第1张图片

每个人都有懒惰的一面,我当时正是如此,如果仔细考虑一下,至少存在两个应该去深究的问题: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 Error 1 of 1"问题剖析_第2张图片

发现这点无疑让我对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文件路径是错误的。

"RSL Error 1 of 1"问题剖析_第3张图片

"RSL Error 1 of 1"问题剖析_第4张图片

问题已经很清晰了,农场是一个单独的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缓存的机子上拷贝到有问题的机子上去。

你可能感兴趣的:(框架,浏览器,Flex,IE,Flash,视频会议)