前言

前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法。

Razor视图引擎优化(优化一)

我们知道默认情况下配置MVC去解析一个视图会首先约定通过查找所有的匹配Web Form视图引擎的名称。例如当我们查找一个不存在的视图时,会出现如下错误:

从上面我们可以很明显的知道,如果我们MVC应用程序中没有使用ASPX视图时,当我们在Action方法中通过 return View() 返回视图或者 Html.RenderPartial 等查找视图时每次都会检查上述四个未使用的位置,此时这是相当的耗时而且性能十分低下尤其是当视图比较庞大时,这样造成的后果简直无法想象。我们有没有什么解决的办法呢?如下:

移除Web Form视图引擎

在MVC中移除Web Form视图引擎非常简单,我们需要移除所有的Web Form视图引擎仅仅留下Razor视图引擎,我们在Global.asax.cs的Application_Start事件中添加如下代码:

            //移除所有视图引擎
ViewEngines.Engines.Clear(); //添加Razor视图引擎
ViewEngines.Engines.Add(new RazorViewEngine());

此时我们再来运行下程序:

我们成功的移除了ASPX视图引擎。

注意 :通过上述移除Web Form视图引擎,此时我们基于Razor视图引擎查找匹配的第一个视图就是正确的,所以此时Razor视图引擎的性能较比之前接近将提升两倍,当然这样使用必须要有前提,确保我们的MVC应用程序中不会用到Web Form,如果我们既想使用Razor视图引擎又想使用ASPX视图引擎则不能那么做。

设置Debug = false(优化二)

在MVC中调试模式和发布模式对MVC应用程序究竟有什么不同呢?

Debug Mode (调试模式)

在调试模式下,视图解析有利于开发中进行优化,通过视图解析一次又一次请求我们的代码最终渲染成一个有名称的视图被称为视图迭代,这种作用是很显而易见的,当我们在进行实际开发时对代码进行了更改我们需要环境立即做出响应。

Release Mode(发布模式)

在发布模式下,MVC的视图解析有利于性能的优化,当一个视图在发布模式下被正确解析了,此时会缓存该搜索的结果,当再次遇到以该视图命名的引用时不需要在另外一个文件系统中进行搜索。

通过上述描述我们能够理解如果模式是在发布模式下在第一次被解析后,其结果是能够被缓存的,虽然在视图引擎中Web Form视图引擎优先于Razor视图引擎执行,但是主要在第一次被解析后其结果会被缓存,所以其带来的影响可以忽略不计。只要我们的生产环境不是在调试模式下,这个视图解析问题可以完全被消除。

那么问题来了,设置Debug = false仅仅是为了视图引擎? 显然不是,我们接着往下看。

视图解析缓存只是一个为了确保我们的网站没有运行在调试模式下众多中的一个理由,其实还有其他严重缺点。

(1)超时问题(Timeouts)

不知道你是否注意到,我们曾花大量的时间在没有暂停的请求超时问题下进行着调试,这是因为我们设置【debug="true"】完全禁止了请求超时,很显然这在一个已上线的网站上这样做不是一个好主意。

(2)捆绑和压缩(Bundling and  Minification)

貌似听到这两个词感觉很陌生对吧,我们一一来看你就恍然大悟了。

在创建项目App_Start文件夹下有个 BundleConfig 配置,这个就是用来捆绑脚本和压缩脚本以及样式的配置文件。例如我们现在将jquery脚本进行捆绑,如下:

   bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));

此时我们来看看结果:

此时我们将配置文件中模式进行如下更改:

我们再来看看结果:

这就验证了我们的观点,如果是在发布模式下它将会自动进行捆绑和压缩,但是当我们在配置文件中将【debug="true"】此时将不会缩小、也不会绑定脚本组合从而达不到缩短请求时间的目的。很显然在开发中调试时这是非常重要的,但是其违背了我们在生产环境进行了性能优化的基本准则,这一点我们需要注意。

对于上述对于捆绑和压缩脚本或者样式的问题,有人就会想了,我们可以通过代码来进行显示启动,如下在BundleConfig配置文件中进行设置也是可以的:

 BundleTable.EnableOptimizations = true;

通过上述代码即使在Web.Config文件中将模式设置为了【Debug="true"】此时也会启动压缩和捆绑脚本或者样式,因为其显式覆盖了在Web.Config环境中的设置。

(3)WebResource.axd缓存

对于客户端资源优化,服务资源只有在发布模式下才会包括在缓存头中,在调试模式下根本不会去进行缓存。

参考

A harsh reminder about the importance of debug=”false”

Bundling and Minification

结语

这节我们大概通过对内置默认的一些配置进行修改来提高MVC应用程序性能,希望对阅读本文的你有所帮助,下节我们继续进行MVC系列讲解。

ASP.NET MVC之如何看待内置配置来提高性能优化(四)的更多相关文章

  1. ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则

    ASP.NET MVC 学习笔记-7.自定义配置信息   ASP.NET程序中的web.config文件中,在appSettings这个配置节中能够保存一些配置,比如, 1 <appSettin ...

  2. ASP,ASP.net,JSP语法、内置对象对比

    1 各自的HelloWord版本 1.1 ASP <%  Response.Write("hello asp") %> 文件名为test.asp. 1.2 ASP.ne ...

  3. [转] Spark sql 内置配置(V2.2)

    [From] https://blog.csdn.net/u010990043/article/details/82842995 最近整理了一下spark SQL内置配.加粗配置项是对sparkSQL ...

  4. jsp中9个内置对象与servlet对应关系及四个作用域

    参考:  <jsp&servlet学习笔记.第2版.林信良><JSR-245 JavaServer Pages 2.2 Maintenance Release Specifi ...

  5. Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案(转)

      前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件 ...

  6. Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  7. 转-Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  8. 【转】Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案

    前言 刚开始创建MVC与Web API的混合项目时,碰到好多问题,今天拿出来跟大家一起分享下.有朋友私信我问项目的分层及文件夹结构在我的第一篇博客中没说清楚,那么接下来我就准备从这些文件怎么分文件夹说 ...

  9. ASP.NET没有魔法——ASP.NET MVC 与数据库之EntityFramework配置与连接字符串

    前几篇文章中介绍了如何使用Entity Framework来操作数据库,但是对EF的配置.连接字符串的指定仍然存在一些疑问. 本章将对EF的配置进行介绍. EF可以通过两种方式来实现配置,分别是代码方 ...

随机推荐

  1. 回流(reflow)与重绘(repaint)

    最近项目排期不紧,于是看了一下之前看了好久也没看明白的chrome调试工具的timeline.但是很遗憾,虽然大概懂了每一项是做什么的,但是用起来并不能得心应手.所以今天的重点不是timeline,而 ...

  2. iOS 清除缓存

    iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒.它包含三个文件夹: Documents: 苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下 ...

  3. @dynamic 模拟NSManagedObject类的内部实现,AFN的非常规用法

    @property和@synthesize复习 @property生成setter和getter的声明,同时生成属性对应的成员变量,并且前面加一个下划线_.如果将getter和setter的实现同时重 ...

  4. IE6 的兼容相关问题

    因为在实习公司要求兼容IE6+,所以将IE6相关的样式兼容问题列出,及解决方案. 1.让页面变丑的透明背景图片问题: HTML都为以下代码: <div class="img-png&q ...

  5. [LintCode] Product of Array Except Self 除本身之外的数组之积

    Given an integers array A. Define B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], calculate B WI ...

  6. 视区相关单位vw, vh..简介以及可实际应用场景

    这篇文章发布于 2012年09月24日,星期一,01:15,归类于 css相关. 阅读 37012 次, 今日 12 次 by zhangxinxu from http://www.zhangxinx ...

  7. js微博发布框的实现

    观察了微博发布框, 1.发现他的剩余文字是动态改变的, 2.且文字为零时 发布框颜色为暗色 3.文字不符合标准时提交不通过 整理了一下思路 js会主要用到的方法 1.onclick() //点击发布时 ...

  8. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  9. Javascript基础回顾 之(一) 类型

    本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...

  10. 使用Akka.net开发第一个分布式应用

    系列主题:基于消息的软件架构模型演变 既然这个系列的主题是"基于消息的架构模型演变",少不了说说Actor模型.Akka.net是一个基于Actor模型的分布式框架.如果你对分布式 ...