Asp.Net网站的的编译与发布原理

如下所示创建一个简单的asp.Net Web应用程序

在VS中生成解决方案之后,可以在项目的目录下看到以下的文件:

当我们通过VS将网站发布出去之后,可以看到,最后生成的文件,如下图所示:

我们可以发现,发布之后的项目文件夹内少了很多文件,其实这是VS将aspx页面和一般处理程序以及Global文件等的后台文件都编译成了一个dll文件,这个dll文件存放在bin文件夹内:

对这个程序集进行反编译之后,可以看到我们写的后台代码都编译到这个dll文件中了

这个是一般处理程序的ProcessRequest方法中的代码,可以看到就是我们写的源代码:

此时项目文件夹内的几个文件中只剩下一些简单的声明了,所有后台代码都已经不见了:

Global文件:

一般处理程序:

aspx页面:

然后我们通过以下这句代码分别获得页面,一般处理程序以及Global编译运行时所在的位置:

        System.Reflection.Assembly.GetExecutingAssembly().Location

经过对比可以发现Global文件、一般处理程序、aspx后台代码所在的程序集文件为同一个,而aspx前台页面的代码运行在另一个程序集中,以下为运行的结果:

Global和aspx页面的前台与后台运行文件:

一般处理程序的后台代码:

我们可以看到IIS运行网站时,实际将网站编译之后的dll文件都放到了对应的Framework版本中的临时文件夹中了

即在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files下,网站中自己写的后台代码与类库以及引用的类库都被编译到了这个临时文件夹下当前项目所在的文件夹下的assembly文件下。

 

 

网站发布后的文件分布图:

 

 

 

 

此时对比发布的网站根目录下的bin文件夹里的dll文件和一般处理程序运行时所在的程序集,可以发现两者是同一个文件:

此时如果删除网站根目录先的bin文件夹内的dll,然后再浏览页面内,可以发现网站无法正常运行:

由上面的结果可以看出,虽然网站中已经存在了一个后台代码的dll文件,但是网站实际运行的是系统文件夹中的那个dll文件,这个应该是直接从网站中拷贝过去的,它们的MD5值完全相同。

在这里可以推测,对于asp.Net应用程序来说,IIS只会编译aspx页面,一般处理程序,Global等文件,但是不会编译其他的类文件,所有的类文件对IIS来说没有用处,IIS只能使用编译好的dll文件。

当网站正在运行时,无法删除系统文件夹中的那个dll文件,显示被IIS Worker Process占用,这个更加说明网站实际运行时使用的是这个dll文件

那么这个IIS Worker Process进程是什么呢,当我们结束当前网站对应的w3wp.exe进程时,系统文件夹中dll被成功删除,这个可以说明,这个dll的调用者正是w3wp.exe这个进行,也说明了w3wp.exe是网站的工作进程。

当我们删除系统文件夹中的dll文件时,再次访问网站时会重新在系统文件夹中再次生成dll文件,而且第一次访问时候报错:

再次访问就正常了

总结:

所以可以总结出,在IIS中运行asp.Net应用程序时,前台页面的代码是即时进行更新和编译的,当我们修改前台代码时,不需要重新编译项目或者重新发布网站,在访问网站时,IIS(或者.Net框架?)检测到页面发生了修改会帮我们重新编译页面,而在修改了后台代码和其他的类文件的时候就需要我们手动对源代码进行重新编译了。



以上的内容都是针对Asp.Net应用程序来说的

对于Asp.Net网站来说发布网站时不会将页面和一般处理程序以及其他一些代码编译成dll文件,只会将源文件和引用的一些类库拷贝到网站的目录下,对于解决方案中的其他类库,也会在编译好之后再拷贝到Bin文件夹中。

在这里可以推测,在asp.Net网站中,IIS或者其他的程序,在有人第一次访问网站时,将App_Code文件里的源代码编译成了dll程序集

当用户第一次请求时才进行即时编译,编译好的文件也是存在于系统文件夹下

如:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\7812c4be\73872874

此时生成的文件有以下这些:

直接在VS中调试时,情况与上述在IIS中运行类似,只是最后所在的文件目录有所不同,而且会生成很多调试用的文件:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\website1\0e58724c\a4f149c8

总结:

         Web应用程序和Web网站的前台页面的代码都是在网站运行时,被初次访问时进行编译的,而对于后台代码和网站中的一些类文件来说,Web网站也会在网站第一次被访问的时候被编译,所以,Web网站中的后台代码更改后不需要手动进行编译,而在Web应用程序中,后台代码和类文件都会在发布的时候进行编译,编译成功才能够正常发布,所以对于Web应用程序,修改了后台代码就必须重新编译然后发布。

注:网站编译的临时目录可以在IIS中或者Web.config配置文件中进行配置,一下是IIS中的修改方法:

在服务器级或者网站级的".Net编译"选项中修改编译的临时目录,默认情况下临时目录为网站对应的.Net Framework的版本下的Temporary ASP.NET Files文件夹。

时间: 2024-10-17 01:24:43

Asp.Net网站的的编译与发布原理的相关文章

网站优化记录-通过命令预编译Asp.net 网站,成功优化到毫秒级别。

在去年一次项目上线时发现部署的站点首次访问跟回收后响应特别慢,每次都在3秒以内.(使用的是vs工具预编译的方式发布),在随后找到解决办法是通过命令预编译Asp.net 网站,成功解决站点响应在毫秒级别. 预编译 ASP.NET 网站 预编译 ASP.NET 网站可缩短用户的初始响应时间,因为页在第一次被请求时无需编译.这对于经常更新的大型网站尤其有用. https://msdn.microsoft.com/zh-cn/library/ms227972(VS.80).aspx 微软介绍 使用说明打

asp.net网站发布

1.iis里面新建一个网站,目录可以新建(例如:F:\dotNetWeb),还可以创建子文件夹如:F:\dotNetWeb\my,网站路径是可以自己设置的,也可以使用IIS默认的网站. 2.vs2010  对应项目右键 ->发布网站, 1)如果是asp.net网站项目,直接设置"目标位置" . 2)如果是asp.net web应用程序,可以选择发布方法为“文件系统”,然后设置"目标文件" 3.  选择对应的.net framework版本 在访问过程中,如果出

asp.net 网站发布

asp.net 网站发布 1.安装并打开IIS. 2.用visual studio创建网站,目录为d:\website\website1 3.IIS中添加网站,网站名称必填.物理路径与已有的对应好.IP地址为本机IP. 4.启动网站后,浏览器输入 http://192.168.1.107:80  就可打开. 5.在vs解决方案目录中,对页面右键单击,选择"在浏览器中查看".此时vs作为调试用的web服务器,注意此时浏览器地址栏.与IIS开启与否无关. asp.net 网站发布

Roslyn导致发布网站时报错:编译失败

最近新升级了Visual Studio 2017,创建的Web项目Bin目录中多了一个叫roslyn的文件夹,该文件夹导致网站在某些服务器上发布出错 从网上搜索了一下,Roslyn是新出的动态编译工具 但是在服务器上安装.net4.6后仍然提示编译出错. 解决方法:打开解决方案NuGet包管理器,卸载一个叫"Microsoft.CodeDom.Providers.DotNetCompilerPlatform"的包,之后重新编译网站,发现Bin目录下没有roslyn文件夹了!

[转]预编译 ASP.NET 网站

转自:如何:预编译 ASP.NET 网站 Visual Studio 2005 预编译 ASP.NET 网站可缩短用户的初始响应时间,因为页在第一次被请求时无需编译.这对于经常更新的大型网站尤其有用. 本主题中的过程使用 ASP.NET 编译工具 (Aspnet_compiler.exe) 的开关和参数.有关此工具的更多信息,请参见ASP.NET 编译工具 (Aspnet_compiler.exe). 有关预编译的更多信息,请参见 ASP.NET 网站预编译. 就地预编译 ASP.NET 网站

asp.net 网站 发布时 去掉.cs文件

VS2013在WIN8下扁平的UI和我今天锈垢的大脑,让找这个设置找了好半天!!! OK,言归正传. 在要发布的网站上右键,选择"发布网站". 在发布窗口中,会让你选择一个发布配置文件,没有的话点击下拉菜单在里面选择新建一个. NEXT. 好,现在发布一下网站.发布出来的文件没有包含*.cs文件. 打开bin目录,会发现其中有一个名字为STAROCK_PAGES.dll文件,这就是之前根据设置生成的预编译文件. OK,就到这里吧,很简单,只是一开始真心没注意到那个下拉的设置!气人~ 收

通过TeamCity实现ASP.NET Core Web Application的自动编译及发布

下载 TeamCity,当前版本:2017.1 TeamCity插件:.NET Core Support .NET Core SDK,当前版本:1.0.1 安装 安装TeamCity.需要注意的地方: 安装路径 端口,这里是9080 安装Server和Agent Windows 服务的账号(这里建议使用系统账号而不是用户账号) 安装完成后会自动打开TeamCity的页面,开始初始化配置.数据目录,数据库和管理用用户. 安装TeamCity插件:.NET Core Support. 安装插件有两种

项目管理实践【五】自动编译和发布网站【Using Visual Studio with Source Control System to build and publish website automatically】

在上一篇教程项目管理实践[三]每日构建[Daily Build Using CruiseControl.NET and MSBuild] 中,我们讲解了如何使用CCNET+MSBuild来自动编译项目,今天我们讲解一下怎么使用MSBuild+WebDeployment+Robocopy自动编译过和部署ASP.NET网站. 首先安装下面的三个软件: 1.MSBuild.Community.Tasks下载:http://msbuildtasks.tigris.org/files/documents/

asp.net 网站国际化在使用资源文件发布到IIS上不可访问,因为它受保护级别限制

asp.net 网站国际化在使用资源文件发布到IIS上报错:编译器错误消息: CS0122: "Resources.Resource"不可访问,因为它受保护级别限制 后来在网上找了很久,才找了个解决方案 在资源文件属性上选择生成操作为"内容",不要选择"嵌入的资源"