如何提高ASP.NET MVC应用程序的性能?
下面是一份已编制好的可能引起改进的来源列表:
通用
缓存
CompiledQuery.Compile()
递归地避免重新编译查询表达式。OutputCacheAttribute
缓存不易更改的内容,以节省不必要的操作执行。ActionResult
方法。RouteName
来组织路由,然后使用它来生成链接,并尽量不要使用基于表达式树的ActionLink方法。PartialViews
中,避免多次渲染:如果您在同一个视图中调用同一个部分300次,那么可能存在问题。解释和基准测试。路由
使用Url.RouteUrl("User", new { username = "joeuser" })
指定路由。Rudi Benkovic 的 ASP.NET MVC 性能
使用这个辅助器UrlHelperCached
来缓存路由解析。Rudi Benkovic 的 ASP.NET MVC 性能
安全性
DAL
负载均衡
客户端
全局配置
如果您使用Razor,请在global.asax.cs中添加以下代码,默认情况下,Asp.Net MVC会使用aspx引擎和razor引擎进行渲染。这只使用RazorViewEngine。
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
在web.config文件中添加gzip(HTTP压缩)和静态缓存(图片、css等...)
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
基本建议是遵循REST原则,以下几点将这些原则与ASP.NET MVC框架联系起来:
Code Climber和这篇博客文章提供了详细的提高应用程序性能的方法。
编译查询可以提高应用程序的性能,但它与ASP.NET MVC无关。它可以加速每个数据库应用程序,因此这不是MVC的主题。
这可能很显然,但在生产环境和性能分析期间,请将您的站点运行在发布模式下,而不是调试模式下。发布模式要快得多。调试模式可能会隐藏您自己代码中的性能问题。
这并不是一个惊天动地的优化,但我想提出这个建议 - 使用CDN来加载jQuery等内容。
引用ScottGu的话:Microsoft Ajax CDN 可以显著提高使用ASP.NET AJAX或jQuery的ASP.NET Web Forms和ASP.NET MVC应用程序的性能。该服务免费提供,无需注册,可用于商业和非商业用途。
我们甚至在使用jQuery的Moss网页部件中也使用CDN。
当通过LINQ访问数据时,请依赖于IQueryable...
...并采用良好的存储库模式:
这将优化数据访问,以确保只加载需要的数据,并且仅在需要时加载。
我也会添加:
使用Sprites:Sprites是减少请求的好方法。您可以将所有图像合并成一个单独的图像,并使用CSS来获取Sprite的好部分。Microsoft提供了一个很好的库来实现这一点:Sprite和Image Optimization Preview 4。
缓存服务器对象:如果您有一些引用列表或数据很少更改,可以将它们缓存在内存中,而不是每次查询数据库。
使用ADO.NET而不是Entity Framework:EF4或EF5
很适合减少开发时间,但优化起来会很痛苦。优化存储过程比Entity Framework更简单。因此,尽可能使用存储过程。Dapper提供了一种简单的方法来查询和映射SQL,性能非常好。
缓存页面或部分页面:MVC提供了一些易于过滤的方法,根据某些参数缓存页面,因此请使用它。
减少数据库调用:您可以创建一个唯一的数据库请求,返回多个对象。在Dapper网站上检查。
始终具有清晰的架构:即使在小项目中,也要拥有清晰的n层架构。这将有助于保持代码清洁,并且如果需要,更容易优化它。
您可以查看此模板“Neos-SDI MVC Template”,它将为您创建一个干净的架构,并具有许多默认的性能改进(请检查MvcTemplate网站)。
有一个非常简单的方法,就是在访问页面所需的数据时异步思考。无论是从Web服务、文件、数据库或其他地方读取数据,尽可能使用异步模式。虽然这不一定会使任何一个页面更快,但它将有助于整体提高服务器的性能。