架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13538|回复: 0

[资料] ASP.NET MVC5 使用预编译模式发布,提高页面加载速度和性能

[复制链接]
发表于 2020-8-22 10:05:17 | 显示全部楼层 |阅读模式
当一个项目页面太多的时候,iis启动和第一次打开网站的时候,会变得非常慢,这是因为项目在发布时没有进行预编译,而是在用户访问网页时动态编译。如果希望提高现有站点的性能并对站点执行错误检查,项目发布的时候选择“在发布期间预编译”是非常必要的。

引言

对于小型项目,按默认设置发布基本可满足正常运行,首次运行打开第一个页面基本在 56 秒(视服务器配置),其它页面的首次打开也基本在 12 秒完成,非首次瞬间打开。

一旦项目功能变得复杂,文件增多,会导致发布后首次运行打开第一个页面 30 秒以上,其它页面的首次打开 10 秒左右,非首次瞬间打开。

这是因为项目在发布时没有进行预编译,而是在用户访问网页时动态编译,一旦应用程序池回收,或项目文件改动,都会重新编译,再次经历缓慢的“第一次”,这是不能忍的。

预编译的好处

  • 性能。编译后的代码的执行速度要比诸如ECMAScript或VBScript的脚本语言快得多,因为它是一种更接近于机器代码的表示形式,并且不需要进行其他分析。
  • 安全性。编译后的代码要比非编译的源代码更难进行反向工程处理,因为编译后的代码缺乏高级别语言所具有的可读性和抽象性。此外,模糊处理工具增强了编译后的代码对抗反向工程处理的能力。
  • 稳定性。在编译时检查代码是否有语法错误、类型安全问题,以及其他问题。通过在生成时捕获这些错误,可以消除代码中的许多错误。
  • 互操作性。由于MSIL代码支持任何.NET语言,因此可以在代码中使用最初用其他语言编写的程序集。例如,如果正在用C#编写ASP.NET网页,可以添加对使用Visual Basic编写的.dll文件的引用。


ASP.NET Core 预编译

预编译

预编译是ASP .Net Core的默认方式。在发布时,默认会将系统中的所有Razor视图进行预编译。编译好的视图DLL统一命名为 xxx.PrecompiledViews.dll 或者 xxx.Views.dll

动态编译

将项目整个配置成动态编译很简单,添加一个配置项目MvcRazorCompileOnPublish,值为false即可



ASP.NET 网站的预编译

我们使用visual studio 可以通过如下的方法发布web网站:

d285c173-9f52-4167-b292-3df6c4bd4b42.jpg


"允许更新此预编译站点" 选项的意义 我们在发布 .Net web项目时,一般情况下,项目中所有的.CS文件,会自动生成DLL动态链接库,这就能够很好的保护网站的源代码,因为服务端代码一般都是放在.CS文件里面的,既然都生成了DLL文件,那么,上传到服务器,别人就不能轻易打开来看了!

但是,其它的文件,诸如ashx、aspx等文件,里面原来有什么,就是什么,别人可以打开这些文件来查看,尽管别人看不见CS代码,但是仍然能够看见ASPX文件里面的HTML代码或部分服务器控件及相关的属性;ashx这样的文件,就相当于一个cs文件,里面的代码也是能够轻易看见的;

因此,.CS文件安全了,但是ASPX、ashx等文件,就不安全了; 那么,到底有没有一种办法,让上传到服务器的web文件,都安全呢?方法是有的,就是发布的时候,不选中 “允许更新此预编译站点”;

选中 “允许更新此预编译站点”

如果发布web的时候,选中“允许更新此预编译站点”,那么,结果是这样的: 整个网站文件,除了所有的CS文件编译成为DLL文件之外,其它的文件,和原来的没有任何变化,里面是什么,还是什么,只要别人通过记事本一打开,里面的代码、HTML代码等,都可以让别人一览无余。

除此之外,通过此种方式发布的网站,当用户第一次访问某个页面的时候,需要经过编译,查找BUG,之后,如果没有任何错误,才能正常访问,因此,速度会变得比较慢。之后的访问就正常了;

不选中 “允许更新此预编译站点”

如果在发布web的时候,不选中“允许更新此预编译站点”,那么,结果是这样的: 1、网站里面的所有CS文件,都被编译成为DLL文件; 2、除了cs文件,其它的文件,诸如ASPX、ASHX等文件,也一同被编译起来,每个文件都在BIN目录里面生成一个对应的*.compiled文件;

之后,如果您通过记事本查看ASPX、ASHX等文件,里面不会看到任何的代码,就连HTML代码标记都看不见,打开这样的文件,里面只有一行文字,内容为“这是预编译工具生成的标记文件,不应被删除!”,且这些文件的大小都为1kb;

尝试打开网站页面,你会发现,除了项目启动后的第一个页面仍然需要 1~2 秒(无 EF),其余每个页面的首次都是瞬间打开的(EF 的首次慢不在本文讨论范围)。这让我对预编译有一种相见恨晚的感觉!

这里偷偷地告诉你,把 Views 目录删掉也不影响网页正常打开哦~为什么不让删,咱也不敢问,咱也不敢删。

目的达到了,有一些后遗症需要解决,比如 bin 目录内杂乱无章。

选“不合并。为每个页面和控件创建单独的程序集”,结果是 bin 多出许多 App_Web_*.dll 文件。

b2f4a4cc-c0bf-473e-9d2d-aa38ea0afc42.jpg

在发布的时候,项目根目录会生成一个PrecompiledApp.config文件。内容如下:



PrecompiledApp.config 文件用于跟踪应用程序的部署方式,以及 ASP.NET 是否需要在请求时编译任何文件。




上一篇:C# 8.0 新特性知识点讲解
下一篇:EF DbContext 保证上下文唯一
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-18 22:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表