在http://mqingqing123.cnblogs.com/archive/2006/01/14/317162.html
里,我介绍了CodeFile来取代Codebehind,可能你会感觉疑惑:ASP.NET工作组花费了很大的时间建立了与.NET1.1不同的后台文件模型,为什么没有更改.NET1.1的Inherits呢?
其实,我感觉是.NET2.0设计时主要为了和ASP.NET1.1的兼容,才不得不使用Inherits。
对于熟悉ASP.NET1.1并一直使用VS.NET2003的用户来说,他们已经习惯了.NET1.1的web开发模型,这种“习惯”并不仅仅意味这双击Button,系统直接定位到Button按钮的事件处理中,更为主要的是习惯了.NET1.1在部署WEB应用程序的方便:在部署应用程序里,当您将本地开发的程序上传到ISP供应商为你提供的空间里时,您仅仅需要将*.aspx和bin文件夹下的*.DLL文件拷贝到你的空间就可以了,而对于类似*.aspx.cs和*.aspx.resx您可以忽略不计。
如果您以后想升级应用程序也非常简单,只要将升级后的DLL文件覆盖原来的DLL文件即可。
然而,在ASP.NET2.0里,正如上篇文件介绍的,*.aspx文件和*.aspx.cs文件都是不完全类(partial class),这就使得想在部署web应用程序前预先编译 *.aspx.cs变得不可能---这是由于这个条件的限制使得ASP.NET2.0默认是不能够将后台文件编译为二进制的DLL文件的。所以web开发人员在部署.NET2.0的应用程序时,只能够拷贝所有的源代码。
因此,当您使用VS.NET2005进行web开发时,默认的,如果您需要将生成的源代码(*.aspx.cs)连同布局文件(*.aspx)一同拷贝到服务商给你提供的web空间里。
现在,您是不是对ASP.NET2.0的模型感觉到遗憾?至少我是,看看类似CommunityStarter、blogs的源代码,他们的源文件是如此的多,如果您拷贝到服务器给你提供的空间,需要非常的费时,而在.NET1.1里,我仅仅需要拷贝几个DLL文件就可以了,看来ASP.NET2.0的框架确实存在很大的局限性。
不过,别着急,问题出现了总需要解决,这个解决办法就是扩展:ASP.NET1.1的Page指令里也就那几个主要的属性,进入CodeBehind已经由CodeFile取代,那么微软的那些程序员就只好拿Inherits开刀--继续保留Inherits以便和.NET1.1兼容。----这应该就是为什么.NET2.0仍然保留Inherits关键字的原因。
但是接下来还有一个问题:对于同样是.ASPX文件,我们知道.NET1.1的页面可以再.net2.0里运行,那么.NET框架怎么识别用户开发的*.ASPX页面是.NET1.1版本的还是.NET2.0版本的呢?
这个问题就是由Code*解决,如下:
(1)如果您在Page指令里使用了 CodeFile属性,.NET框架自动认为您采用的是.NET2.0技术,后台文件也默认是不完全类
(2)如果您在Page指令里使用了CodeBehind属性,.NET框架自动认为您采用的是.NET1.1技术,后台文件的类直接作为页面的基类
(3)还有一个默认的,就是您的*.aspx里即没有CodeFile也没有CodeBehind,那么系统如何认为呢?在这种情况下系统仍然认为您是使用.NET1.1的框架技术,其实本人感觉这还是为了考虑兼容性,因为.NET1.1版本里就可以省略CodeBehind,如果让.NET1.1和.NET2.0高度兼容就必须始终以.NET1.1为目标。
知道了页面如何区分页面后,解下来继续上面的问题,如何解决部署难的问题。在ASP.NET2.0里,提供了一个新命令aspnet_compiler.exe,默认的您可以在系统盘里找到,例如我的winXP系统里的默认位置在 c:\windows\microsoft.net\framework\版本号 目录里。
aspnet_compiler.exe的使用较为复杂以后会介绍,以后会介绍,在用它之前先介绍它的基本功能。aspnet_compiler.exe会将文件全部编译为二进制文件:清注意这里是全部,也就是使用该编译器后*.ASPX和*.ASPX.CS全部编译为*.DLL,原因还是前面介绍的那个规则:不管什么时候,要编译为DLL文件,都必须提供完整的类。
现在您可以知道ASP.NET2.0的高明了吧,在部署ASP.NET应用程序时,您可以有三种方式:
(1)传统ASP.NET1.1方式:布局代码*.ASPX和编译后的后台bin文件夹下的DLL文件(部分代码+部分二进制)
(2)默认ASP.NET2.0方式:所有布局代码和所有后台文件以源文件的形式存在(全部源代码)
(3)改进后的ASP.NET2.0模式:此时所有布局代码*.ASPX和后台文件*.ASPX.CS都是以DLL的形式存在。(全部二进制)
最后,还要说一下全部编译后的二进制的问题,当你编译后可以发现有一个default.aspx文件,可能你会问既然全部是DLL文件为什么还要default.aspx文件呢?这个文件也没有内容,会不会是多余的?
要理解这个问题就需要转到IIS了,换句话说这就不再是ASP.NET2.0的工作范畴了。
对于客户端请求,IIS首先会根据映射检查您所请求的文件存在不存在,如果不存在就直接提示您所请求的文件没有找到。 可以看到此时ASP.NET2.0框架还没有接管呢,解决这个文件最简单的方法就是不用检测文件是否存在,参考下图(,默认检查文件是否存在是选中的,更为详细的原因,可以参考.BLOGS配置),但是这个步骤虽然不复杂,可以对于许多应用程序来说都需要更改显然非常不现实,现在好了只要有了DEFAULT.asxp不用更改IIS配置也可以了
所以,默认还是需要default.aspx的。