我在面试的时候,通常都会问应试者这个问题,结果通常都令人失望。其实很多用ASP.NET开发多年的程序员对这个问题也都不太清楚。
我为什么要说明这个问题呢?其实这个问题对使用ASP.NET开发而言并没有多大影响,但是如果能够正确地理解他们两者的区别,同样也能帮助我们解决许多在开发过程中遇到的问题。
首先我们从如何创建这两中项目说起,请看下面两张截图。我用的是Visual Studio 2010,Visual Studio 2008的布局大同小异。
如箭头所示,这里是如何创建一个ASP.NET Web Site的项目。
创建一个Web Application需要两部,如上图所示,先选择Project,然后从Web标签中选择ASP.NET Web Application。
这个两个项目都可以直接copy到server,部署为网站,而且表现的内容没有差异。但是从结构,编译,编程方式上面去考虑会看出不同来,下面我们一一说明。
1)Namespace
Namespace是这两个项目最明显的区别之一。需要提到的是,我们在这里讨论C#版本,VB.NET比较特殊,他的Namespace会自动加进去,所以这两个项目在编写过程中,我们都不用写Namespace。
默认情况下,ASP.NET C# Web Site中,我们不需要写Namespace,我们可以尝试创建一个新的页面,然后看他的code页。但是Web Application都需要一个Namespace。当然我们也可以添加为web site添加Namespace。当我们在使用ScriptManager的ServiceReference的时候,在application中,用js调用webservice需要将namespace加上。关于如何使用ServiceReference,请参考我的另一篇文章。
2)编译输出
ASP.NET Web Site在每次运行时都会自动编译,所以,我们在用VS开发的时候,不需要做了点修改,就rebuild下项目,我们可以直接在浏览器中调试结果,但是web application如果是涉及到code behind的修改都需要rebuild项目之后,修改才会被应用上。原因是web site的编译输出并不是在当前项目下,而是一个统一的地址:%SystemRoot%\Microsoft.NET\Framework\version\Temporary ASP.NET Files下,之后在预编译之后,输出才会转到web site的bin目录下。关于预编译的问题,我们可以参考这个链接:http://msdn.microsoft.com/en-us/library/399f057w(VS.85).aspx,建议大家在发布网站的时候都能预编译,这样有助于运行速度,同样有利于后期维护。Web Application编译后会直接输出到Bin目录下。
3)App_Code
只有ASP.NET Web Site才有App_Code,我们一般都把web site中共享的类文件都放在这个目录里,编译器会自动将App_Code里的类文件编译成assembly。
4)AssemblyInfo
ASP.NET Web Application有AssemblyInfo,但是web site没有。
5)Property Pages(项目属性)
在修改项目属性的时候,两者又有很大的区别。Web Application基本上和其他创建的Application一样,都有同样的设置布局。但是Web site精简了很多。
总结:
其实,当初微软设置ASP.NET Web Application是因为收到很多开发员的feedback。早期VS2003的应用程序无法顺利移植到VS2005的web site模型中,尤其在预编译站点的时候,会造成声称多个assemblies。通过web application,开发员可以把网站当作一个普通的application对待。有的人认为Web site好用,有的人认为web application好用,其实微软设立这两个项目模型给我们多了一种选择,可以以我们各自的喜好来创建一个web项目,具体如何选择,那也就要看您的喜好或者您工作的需求了。