子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
posts - 40, comments - 207, trackbacks - 2, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
周末下了点狠心,决定把项目升级到2.0平台,因为VS2003和2005可以并存,所以问题还是比较容易处理的,装上Pro版的2005,打开原来的项目,自动出现升级向导。项目里包含7个子项目,所有的逻辑和显示都是在后台项目里实现的,前台的Web项目里每个文件里都只是实现了一个对后台方法的调用,而且后台也没有用到任何高级的语法,因此升级非常平滑。
总结了一下,Web项目里的项目文件被删除了。原来两个不相干的ASPX文件也被考虑进编译过程了。编译了一下,上传到服务器上,报错。后来发现新编译的项目没有Web项目的Dll了,而服务器的目录上还留着。结果造成内部引用的混乱。删除那个老的Web项目的Dll,OK了。
然后打算试一下发布模式,用VS2005的生成菜单项目里的发布网站功能,设置发布到的目录,选项设成不允许更新,它居然把Web目录下所有的东西复制了一遍出来,所以编译过程很慢。编译完成以后在bin目录下生成了一堆东西,我以为把这些东西拷到服务器上就可以不用干净编译了。结果发现第一次访问页面的时候,还是会出现csc进程。整个网站切换过来以后,还是同样出现了一堆的csc进程,不过编译过程比原来快了一点。
另外出现的一个比较严重的问题,程序似乎过一会就会自动重启一下,导致再编译一次,而且后来发现服务器上出现了一个错误窗口,说是w3wp.exe进程出现错误,是否要进行调试。选择取消以后,w3wp.exe就自动重启了,于是又开始了新一轮的重新编译。这个过程出现了三次,吓的我赶紧切换回去1.1的版本。到事件查看器里看了一下,里面一堆的未处理异常,基本上都是值为空的错误。奇怪了,在1.1的时候没有出现过问题啊,而且代码没有进行改变。
后来查到一篇文章(中文的似乎还没有人提到过),http://www.eggheadcafe.com/articles/20060305.asp,在2.0里面对未处理的异常的处理方式跟1.1有很大的不同,1.1会忽略它,除非影响页面生成。而2.0会导致进程报错,直接影响整个网站运行。听上去是个很严重的问题,但是这样似乎更合理,否则程序员会一直忽略掉这个错误。然而因为这个问题,网站无法切换也是个很严重的问题,因此,还是需要一个平滑过度的方法。上文提到了这个方法,就是自己写一个HttpModule,处理所有的未处理异常,并且可以把异常信息记入系统事件,有利于程序员进行处理。并且上文也提供了这个HttpModule的源码和二进制文件下载,还包含Demo的WebApp。
今天终于弄懂了2.0的预部署发布的编译方式,用VS的发布网站的方式是不对的,一定要用aspnet_compiler.exe来手动编译,而且它的编译过程是针对网站的实际设置的。也就是说,必须把Web项目的内容上传到网站上去,在IIS里面设好网站的路径,然后使用aspnet_compile进行编译,可以进行本地编译,这个过程实际上它是把生成的dll放到C:\Windows\Microsoft.Net里面的缓存目录里的,也就是跟用户实际访问页面的时候csc.exe生成的是完全一致的。经过这一部,用户两次访问的时候就不会有任何编译动作发生了。
好累。顺便想到一个无缝切换的方式,分别保留两个网站,指向两个不同的目录,其中一个是没有主机头的,另一个是有主机头的,用来更新的。更新这个有主机头的网站以后,使用aspnet_compiler编译一下,然后切换两个网站的主机头,这样新访问的用户就会被导向这个新编译过的网站,而用户不会感觉到任何延迟。下次再更新另外一个站点就可以了。

Feedback

#1楼   回复  引用    

2006-09-10 20:56 by 一叶小舟[匿名]
除此之外,代码是否还需要做相应的调整呢?我们公司是做ERP 的,里面封装了大量的自定义组件(包括业务逻辑组件,自定义控件如DataGrid 等),几次都准备升级,但是耽心风险太大,因而都没有尝试过?

#2楼   回复  引用  查看    

2006-09-10 23:41 by ZergTant      
@一叶小舟[匿名]
最好别升级,很麻烦的,尤其是那些用了第三方控件的例如devexpress,出错是正常的

#3楼   回复  引用    

2006-09-11 00:03 by 刘志军[匿名][未注册用户]
我也在升级中遇到些问题,还好最后都解决了,看看我遇到的问题吧
1、是关于在Global中初始化一些对象的问题
http://blog.liughost.cn/blogview.asp?logID=16&cateID=2
2、WEB Services的问题升级时可能也会遇到显示乱码
http://blog.liughost.cn/blogview.asp?logID=20&cateID=2

#4楼   回复  引用    

2006-09-11 08:59 by FA[未注册用户]
用aspnet_compile在服务器上如何手动编译啊?、
我一直是在开发的机器上编译好(发布网站),然后把产生的目录一并考到服务器IIS指向的目录就行了

#5楼   回复  引用  查看    

2006-09-11 09:27 by Boler Guo      
asp.net 2.0 的发布我也没搞明白~

#6楼[楼主]   回复  引用  查看    

2006-09-11 14:58 by Jason Cui      
在本机编译好发布上去它还是会编译一次的,因为运行时取的是缓存目录下的程序,而不是bin目录下的。通常的做法是使用就地编译:
aspnet_compiler -m /LM/W3SVC/534451290/ROOT -c
-m是指根据IIS的网站节点信息自动寻找本地目录,如果有多个网站存在,必须这样用,如果是默认站点下面的虚拟目录,可以用-v -p两个参数。后面那个节点名我是用IIS Resource里面的Meta Explorer读出来的,别的不知道有没有办法看到,它指向的是我的一个新建的站点。-c是重新编译,否则增量编译。这样编译的时候是把生成的dll放到缓存目录里去的,bin目录没有任何变化。当用户第一次访问网站的时候,不再发生编译过程,直接运行。

我的程序用到的东西都很简单,所以没有任何改动就可以编译。自定义组件如果是老版本的(非.Net的),应该也不需要,它会自动升级,如果是.Net的,我想先编译它们就可以了。这个冒险还是值得的,建议在别的机器上测试,如果实在要改的东西多,那也只好放弃了。

#7楼   回复  引用    

2006-09-11 16:06 by FA[未注册用户]
还是没有搞懂如何编译,详细点就好了

#8楼   回复  引用    

2006-09-12 17:56 by FA[未注册用户]
/LM/W3SVC/在那里看?/Root -c
举什例吧!!

#9楼[楼主]   回复  引用  查看    

2006-09-12 19:04 by Jason Cui      
这个数字在IIS的管理界面上,左边选中网站,右边显示出所有的站点,那个标识符那一列就是这个数字了。

#10楼   回复  引用    

2006-09-13 08:48 by FA[未注册用户]
如我的虚拟目录是D:\RDWEB\WEB
用你的/LM/W3SVC/****/ROOT -C
LM---代表什么?W3SVC---代表什么地??Root--代表什么??
我的是WIN2000,没有发现有网站的标识呢,帮我解决一下吧

#11楼[楼主]   回复  引用  查看    

2006-09-13 08:58 by Jason Cui      
LM应该是LocalMachine的缩写,W3SVC是IIS服务的名称,这两个都不会变的。后面的那个标识在IIS的管理界面上,网站的管理里面一共就那么几个列,第一列描述,(默认网站这几个字),第二列就是标识符,也就是中间那几个数字。后面是状态,主机头等等。2000也是一样的。最后的Root是指根目录,因为我是使用的虚拟站点,而不是虚拟目录,因此直接编译根目录,如果有虚拟目录的话,这里应该是目录名称。
建议你装上IIS Resources,里面有Meta Explorer可以直接查看,很清晰的。

#12楼   回复  引用    

2006-09-13 09:46 by witluo@hotmail.com[未注册用户]
升级没有太大问题, 我将我们公司的十几个站点的全部升级到2.0了;还算顺利,遇到了一些小麻烦;比如用windows服务注册remoting2003和2005里安全不一样会导致原来可用,而升级后不可用。 我遇到的最大不爽就是,我们的解决方案框架一共包括大概有13个站点,有110个子项目包;这样的解决方案用vs2005打开非常占资源,打开非常慢经常会停掉。 特别是和VSS绑定后,它的更新源代码状态很耗时!! 大家可以看下升级后的站点:http://www.bitaec.com ,zj.bitaec.com,pm.bitaec.com等



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 500230




相关文章:

相关链接: