[转]RSL编译方式的FLEX站点出现#2046错误的解决办法

http://blog.csdn.net/chen98qqkk/archive/2010/09/30/5916002.aspx

先简单解释下背景知识:
从FLEX4开始,所有web程序都默认使用RSL的编译方式。那用RSL编译的FLEX站点和普通FLEX站点有什么区别呢?简单的说就是,flash player会在你第一次访问任何一个这种FLEX站点时,缓存下大约1M的类库在系统里。下次用户访问这个站点或者任何其他flex站点时都不用再下载类库这部分文件。RSL编译方式就是在编译时把类库都分离出去了。这种编译方式,在同类flash程序通常大小要接近1M的情况下,可以编出100K左右的整站程序,比一张图片都小。好处自然是非常节省带宽和加载时间。我现在做的几个FLEX站点都采用这种编译方式,加上皮肤也采用全矢量绘图,编译出来的整站程序都保持在100K左右,有效的解决了FLASH加载慢的最大问题。

但问题出来了,有一小部分用户第一次访问站点时,总是出现无法缓存类库的问题,表现就是报错"ERROR:#2046"。或者有些用户原来能够访问成功(说明已经成功缓存过类库了),但突然也开始报错了。直接导致的后果就是根本不能加载程序,想要节省加载时间反而导致不能加载,让我一直很苦恼。从做第一个FLEX4程序开始,我就发现了这个问题,当时只有我的电脑不能访问我写的站点,而大家都能,并且我重装了系统几次,都不行。后来不知道怎么的,我又突然就能访问了,就没有太在意这个问题。现在想想,那时候我干了一件他们都没干的事:我修改过系统时间。调整到2008年了。

正好最近又无意中在论坛上看到高人解答,原来报错的用户也都存在同样的问题:系统时间出错了。因为用户系统的时间早于缓存的类库的有效签名时间,被flash player拒绝加载了。那时我刚好在实验室,又这么刚好就有台电脑就不能访问,查下它的时间是2000年。旁边的电脑都能访问。就修改了下时间测试,马上加载成功了~

困扰我很久的问题终于解决了,非常之高兴,遂写了个js脚本加在网页里,加载前先判断下服务器和客户机的时间差。如果太大就弹出提示。让用户把时间改正确,或者就直接跳转到我准备好的无类库缓存版站点。我有给每个flex站点都加上这种无缓存的版本,供应急用。就是简单再写一个full.html,把引用的程序改成对应的非RSL编译方式生成的swf即可。访问方法为:URL后加上full.html,使用上不会有任何差别。
那么RSL的问题算是完美解决了,顺便也把另一个问题解决了吧:在FLEX站点访问时,还会出现另一个问题,就是很多客户机的FLASH PLAYER版本过低,导致FLEX程序不加载,表现为一片空白,不提示任何信息(只有没有安装FP时,浏览器才会自动提示)。这会让用户误以为站点不能访问了。解决办法也是加上个JS脚本,判断一下FP的版本先。下面附上两个JS脚本,在IE/Firefox/chrome测试均完美通过。


检测时间差的JS脚本:
view plaincopy to clipboardprint?
01.var timegap = checkTime();  
02.if(timegap>48)  
03.{  
04.        alert("提示:我们检测到您的系统时间与服务器相差超过了48小时,\n这有可能导致程序无法加载。建议您修改回正确的系统时间,\n或在网址后加上full.html访问程序的无缓存版本。谢谢~")  
05.}  
06. 
07. 
08. 
09.function checkTime()  
10.{  
11.var xmlHttp = false;   
12.//获取服务器时间   
13.try {   
14.xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");   
15.} catch (e) {   
16.try {   
17.    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
18.} catch (e2) {   
19.    xmlHttp = false;   
20.}   
21.}   
22. 
23.if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {   
24.xmlHttp = new XMLHttpRequest();   
25.}   
26. 
27.xmlHttp.open("GET", "null.txt", false);   
28.xmlHttp.setRequestHeader("Range", "bytes=-1");   
29.xmlHttp.send(null);   
30. 
31.severtime=new Date(xmlHttp.getResponseHeader("Date"));   
32.//获取客户端时间   
33.localtime=new Date();   
34.//取得时间差   
35.var jtime=Math.abs(localtime.getTime()-severtime.getTime());   
36.return jtime/(60*60*1000); ;  
37.} 
var timegap = checkTime();
if(timegap>48)
{
alert("提示:我们检测到您的系统时间与服务器相差超过了48小时,\n这有可能导致程序无法加载。建议您修改回正确的系统时间,\n或在网址后加上full.html访问程序的无缓存版本。谢谢~")
}



function checkTime()
{
var xmlHttp = false;
//获取服务器时间
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
    xmlHttp = false;
}
}

if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}

xmlHttp.open("GET", "null.txt", false);
xmlHttp.setRequestHeader("Range", "bytes=-1");
xmlHttp.send(null);

severtime=new Date(xmlHttp.getResponseHeader("Date"));
//获取客户端时间
localtime=new Date();
//取得时间差
var jtime=Math.abs(localtime.getTime()-severtime.getTime());
return jtime/(60*60*1000); ;
}
检测Flash Player版本的JS脚本:
view plaincopy to clipboardprint?
01.var fls=flashChecker();  
02.if(fls<10)   
03.{  
04.    alert("您安装的Flash Player版本过低,页面即将跳转到Flash Player 10安装页面\n安装完成后请重启浏览器即可使用~");  
05.    window.location.href="http://get.adobe.com/cn/flashplayer/";    //如果你的程序是建设在内网,建议修改这个地址为你的内网链接  
06.}  
07. 
08.function flashChecker()  
09.{  
10.var flashVersion=0;  //flash版本  
11. 
12.if(document.all)  
13.{  
14.var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');   
15.if(swf) {  
16.VSwf=swf.GetVariable("$version");  
17.flashVersion=parseInt(VSwf.split(" ")[1].split(",")[0]);   
18.}  
19.}else{  
20.if (navigator.plugins && navigator.plugins.length > 0)  
21.{  
22.var swf=navigator.plugins["Shockwave Flash"];  
23.if (swf)  
24.    {  
25.       var words = swf.description.split(" ");  
26.       for (var i = 0; i < words.length; ++i)  
27.{  
28.         if (isNaN(parseInt(words[i]))) continue;  
29.         flashVersion = parseInt(words[i]);  
30.}  
31.}  
32.}  
33.}  
34.return flashVersion;  
35.} 
var fls=flashChecker();
if(fls<10)
{
alert("您安装的Flash Player版本过低,页面即将跳转到Flash Player 10安装页面\n安装完成后请重启浏览器即可使用~");
window.location.href="http://get.adobe.com/cn/flashplayer/"; //如果你的程序是建设在内网,建议修改这个地址为你的内网链接
}

function flashChecker()
{
var flashVersion=0;  //flash版本

if(document.all)
{
var swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
if(swf) {
VSwf=swf.GetVariable("$version");
flashVersion=parseInt(VSwf.split(" ")[1].split(",")[0]);
}
}else{
if (navigator.plugins && navigator.plugins.length > 0)
{
var swf=navigator.plugins["Shockwave Flash"];
if (swf)
    {
       var words = swf.description.split(" ");
       for (var i = 0; i < words.length; ++i)
{
         if (isNaN(parseInt(words[i]))) continue;
         flashVersion = parseInt(words[i]);
}
}
}
}
return flashVersion;
}

解决了这两个问题,现在就可以放心部署FLEX4站点了~


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chen98qqkk/archive/2010/09/30/5916002.aspx#
return flashVersion;
}

解决了这两个问题,现在就可以放心部署FLEX4站点了~

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chen98qqkk/archive/2010/09/30/5916002.aspx

你可能感兴趣的:(Flex,脚本,chrome,Flash,FP)