• RSL编译方式的FLEX站点出现#2046错误


    flex站点不能打开了~~~~(>_<)~~~~ ,报#2046错误,在其他机器访问页是ok的,在清缓存、重装flashplayer一些折腾之后,还是
    不行,最后在王同事的帮助下,找到了问题所在,原来是系统时间差远了去了,居然是2001年。当时为了loadrunner 支持500个
    java Vuser,换了一个非常过期license,需要修改系统时间才可使用,google来一段。粘上

    先简单解释下背景知识:

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

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

    因为用户系统的时间早于缓存的类库的有效签名时 间,被flash player拒绝加载了。

    困扰我很久的问题终于解决了,非常之高兴,遂写了个js脚本加在网页里,加载前先判断下服务器和客户机的时间差。如果太大就弹出提示。让用户把 时间改正确,或者就直接跳转到我准备好的无类库缓存版站点。我有给每个flex站点都加上这种无缓存的版本,供应急用。就是简单再写一个 full.html,把引用的程序改成对应的非RSL编译方式生成的swf即可。访问方法为:URL后加上full.html,使用上不会有任何差别。

    那么RSL的问题算是完美解决了,顺便也把另一个问题解决了吧:在FLEX站点访问时,还会出现另一个问题,就是很多客户机的FLASH PLAYER版本过低,导致FLEX程序不加载,表现为一片空白,不提示任何信息(只有没有安装FP时,浏览器才会自动提示)。这会让用户误以为站点不能 访问了。解决办法也是加上个JS脚本,判断一下FP的版本先。下面附上两个JS脚本,在IE/Firefox/chrome测试均完美通过。

    检测时间差的JS脚本:

    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脚本:

    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; 
    }

    转:http://blog.csdn.net/wsywfw3/article/details/6156440

  • 相关阅读:
    Asp.net MVC中 Controller 与 View之间的数据传递
    Asp.net中WebForm 与 MVC的架构区别
    初步理解MVC
    JavaScript 设置、读取Cookie
    JavaScript 设计模式之工厂模式
    JavaScript对象 属性
    JavaScript中对于闭包的理解
    WebApi 实例
    webservice 简单实例
    【转】Linq 语法
  • 原文地址:https://www.cnblogs.com/bmate/p/2575963.html
Copyright © 2020-2023  润新知