Spiga

解决Silverlight3部署的时候实际上反复下载2.0甚至是IE8和chrome假死的情况

2009-04-25 04:17 by 梁逸晨, 1791 visits, 收藏, 编辑
正文之前,我发一些唠叨: 

比尔盖茨在他的2008年最后一次公众演讲中强调:“微软做的一切都是为了开发者”。

但是我不这么认为,因为自从 .netframework 诞生那天至今已有8年,微软从来就没有为部署 .net 做过他们本来可以做,而且很容易做,并且随时可以做的事情:在XP的SP和2003的SP中部署当时最新版本.net。虽然VISTA和WINDOWS7已经部署了他们发布时的最新.netframework, 但是VISTA的SP1和SP2以及WINDOWS2008SP2中依然是没有包含3.5SP1。

然后,就由我们去和客户解释:“麻烦您装个.net吧”、“请耐心等待一下,装3.5是需要一些时间的”。 

最基本的问题都没有解决,这是为了开发者着想吗?绝对不是!

JAVA和FLASH可以实现自动升级,.net 却不做,这又谈何为了开发者着想?

---------------------------------- 唠叨完毕,下面是正文 ---------------------------------------- 

 

这个惯例在最新的Silverlight3中得到了延续,并且升华到了毁灭性的程度,什么叫毁灭性?请看下面几个例子:

1 在IE6的环境下,如果没有安装过Silverlight,而被要求提示安装,并且跳转到http://go.microsoft.com/fwlink/?LinkID=143433的时候,可以正常安装3.0

2  在IE6的环境下,如果已经安装过Silverlight2.0,要求提示安装3.0时,跳转到http://go.microsoft.com/fwlink/?LinkID=143433的时候,会实际下载2.0,然后下次继续这样无限反复

3  在IE7的环境下,如果没有安装过Silverlight,而被要求提示安装,并且跳转到http://go.microsoft.com/fwlink/?LinkID=143433的时候,可以正常安装3.0

4  在IE7的环境下,如果已经安装过Silverlight2.0,会弹出两个对话框,都是提示现有Silverlight已经过期,要求升级,点击任何一个之后,都是跳转到http://go.microsoft.com/fwlink/?LinkID=143433的时候,会实际下载2.0,然后下次继续这样无限反复

5  IE8的情况和第4点一样,但是恶化得更厉害:两个对话框点击任何一个都会出现 “窗口无响应”的错误提示,然后直接假死。 

6  chrome的情况和IE8一样,很恶劣。 

7  firefox的情况和IE7一样,同样比较恶劣。 



以上的几点测试环境说明:  IE8是WINDOWS7自带的,属于IE8正式版,chrome也安装于Windows7。  IE6和IE7、Firefox是XP和WINDOWS2008R1中的。vista就不测试了,情况绝对是一样。(我的主系统是Windows7,XP和2008是虚拟机中的,因为牵扯到需要至少重启10多次虚拟机、不花费半天搞不完的情况, 所以我就不截图了。)

面对如此的情况,我们根本不敢直接部署Silverlight3,因为这不仅仅是可用性的问题,而是属于破坏性的体验,直接把客户逼走,下次绝对不会再来,如果遇到浏览器假死,电脑知识比较贫乏的客户还会到处宣扬你的网站有病毒,到时候这生意是彻底玩完。

面对微软,堂堂一个世界第一软件公司,这种低级错误谈何为了开发者着想?

虽然产品宣传策略上我对微软是抱有很大的意见,但是silverlight3实在是太好,比起2.0,简直一个天一个地,不用不行,所以还是老办法,自己宣传.netframework,自己宣传Silverlight。



研究了两天,发现罪魁祸首是silverlight2.0自作聪明,自己弹出个不着边的对话框。并且会截断我们在OBJECT中自己定义的3.0下载地址。所以,我们只能预先检测silverlight运行时,通过javascript来判断该怎么加载。 以下是我自己搞出来的偏方,可以解决浏览器假死和反复下载问题,其原理就是让2.0根本就没有机会运行:

 

首先我们需要加载 Silverlight.js 这个文件,可以自己VS2008和blend中去找,也可以从这里下载

然后,直接在window.onload事件中调用我的这个函数:

 

    
function checkLight() {
    

            
var light_main =  document.getElementById("light_main");// 放置silverlight对象的div的id

            
var light = Silverlight.isInstalled("3.0");

            if (light) {  

 

  light_main.innerHTML =

                '<object data="data:application/x-silverlight," type="application/x-silverlight" width="428" height="148">' +

       '<param name="source" value="http://files.cnblogs.com/kvspas/test_light.xap"/>' +

       '<param name="onerror" value="onSilverlightError" />' +

       '<param name="background" value="black" />' +

       '</object>';

            }
            
else {

                light_main.innerHTML 
= "<a href=\"http://go.microsoft.com/fwlink/?LinkID=143433\" target=\"_blank\"><img src=\"自己弄个合适你网站的备用图片\" alt=\"正确运行本站程序需要Silverlight3.0或更高版本\" /></a>";
                //尚未具备3.0运行时
            }    

}


 下面是根据以上代码做的测试(如果没有安装silverlight3,会看到一幅图片说你没安装,点击后可以正常下载3.0,不会反复重装,更不会假死,否则应该有一个silverlight3动画):   

 

ADOBE自动升级FLASH,不会被告垄断,ORACLE自动升级JAVA,也不会被搞告垄断,微软自动升级.NET和Silverlight如果被那些流氓联盟控告的话,鲍先生,您完全可以买两架波音777以“不友好的方式“降落到白宫和欧洲议会,然后把微软总部迁移到我们中国来,以您的性格,我相信您做得到的。 毕竟没有任何一位微软技术开发者愿意看到windows7时代为了部署.net 4.5和silverlight4.0,windows8时代为了部署.net6.0和silverlght8.0而伤脑筋。难道想让我们为.net而做流氓插件自动下载?开发者因此而流失到苹果、谷歌、IBM、ORACLE那边的话,微软也是不愿意看到的,何苦呢?

 

半夜4点发贴,难免代码会有错误,如果有BUG,明天我会解决。

 

顺便说句后话:写这篇文章的时候,WINDOWS7RC正好发布,就在我准备提交这篇文章时,因为迅雷下载得太厉害,把系统搞蓝屏了,幸好中途备份!幸好中途备份!同时也建议博客园开发团队做个自动实时保存的功能,技术文章一般都比较长,遇到类似我这种中途蓝屏的情况,不会有人愿意再重新写的。

 

 -------------------------------------

发布本文的时候 , Silverlight3 属于BETA范畴是众所周知.

但是3楼的评论包含太多的常识性错误,本人不希望自己博客的评论出现这种天方夜谭的事情,已经删除.