65.9K
CodeProject 正在变化。 阅读更多。
Home

如何提高 ASP.NET MVC Web 应用程序的性能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (10投票s)

2009年8月30日

CPOL

4分钟阅读

viewsIcon

112687

在本文中,我将探讨如何通过利用各种组件来提高 ASP.NET MVC 应用程序的性能

引言

在本文中,我将探讨如何通过利用以下组件来提高 ASP.NET MVC 应用程序的性能

  1. 实现缓存
  2. 实现 HTTP 压缩
  3. 使用 Google Hosted Ajax Libraries 实现 JQuery UI 库
  4. 通过合并脚本和其他资源
  5. 以发布模式部署生产代码
  6. 删除 ASP.NET 中的默认 HTTP 模块
  7. 优化 URL 生成

实现缓存

在 MVC 视图中实现缓存的最简单方法是在单个控制器操作或整个控制器类上添加 [OutputCache] 属性。这是一个 GetWeather() 控制器操作,它将被缓存 15 秒。

[OutputCache(Duration = 15, VaryByParam = "None")]
public ActionResult GetWeather(string Id)
{
}

要缓存整个控制器,您需要像下面这样在整个控制器类上实现 [OutputCache] 属性。

[OutputCache(Duration = 15, VaryByParam = "None")] 
public class WeatherController : Controller
    {
        //
        // GET: /Weather/
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult GetWeather(string Id)
        {
        }
   }

有关更多详细信息,请阅读此文

您还可以通过实现 Cache API 以编程方式控制缓存。System.Web.Caching.Cache 类的工作方式类似于字典。您可以将键值对添加到 Cache 类。当您将项添加到 Cache 类时,该项将被缓存到服务器。以下代码示例将一个项添加到缓存中,其滑动过期时间为 10 分钟。

Cache.Insert("Key", "Value",
    null, System.Web.Caching.Cache.NoAbsoluteExpiration,
    new TimeSpan(0, 10, 0));

有关更多详细信息,请阅读此文

ASP.NET Cache 对象的唯一限制是它与 Web 应用程序在同一进程中运行。它不是分布式缓存。如果您想在多台计算机之间共享相同的 ASP.NET 缓存,则必须为每台计算机复制缓存。在这种情况下,您需要使用分布式缓存。要实现分布式缓存,您可以将 Microsoft 分布式缓存(**代号 Velocity**)与 ASP.NET MVC 应用程序结合使用。这是一篇由 Stephen Walther 撰写的精彩文章,其中他进行了详细解释。

您还可以将任何 HTTP get 请求缓存到用户浏览器中预定义的时间,如果用户在此预定义时间内请求相同的 URL,响应将从浏览器缓存加载而不是服务器。这是一篇由 Kazi Manzur 撰写的关于ASP.NET MVC Action Filter - Caching and Compression的精彩文章,其中他进行了详细解释。

实现 HTTP 压缩

实现压缩的最简单方法是应用IIS 压缩,这是一篇精彩文章,解释得更详细。  

您可以应用操作筛选器来压缩 ASP.NET MVC 应用程序中的响应。一篇解释此细节的精彩文章是ASP.NET MVC Action Filter - Caching and Compression

在 IIS 6.0 上部署 ASP.NET MVC 应用程序时存在几个问题。Omar AL Zabir 的解决方案

CodePlex 上还有一个适用于 .NET 的YUICompress 移植版,它可以将任何 Javascript 和 Cascading Style Sheets 压缩到高效级别。

使用 Google Hosted Ajax Libraries 实现 JQuery UI 库

您可以使用 jQuery 构建丰富的客户端站点用户界面。Dino Esposito 在一篇关于构建丰富用户界面的精彩文章中介绍了这一点。您还应该考虑使用Google Hosted AJAX Libraries API,因为它将提高站点性能。请参阅Google Hosted Ajax Libraries 的试用

通过合并脚本和其他资源

ASP.NET MVC Client-side Resource Combine 是 CodePlex 上提供的另一个很棒的库。此库要求您将客户端资源组织到不同的集合中,每个集合都有不同的配置设置(尽管没有什么能阻止您拥有一个 1 文件资源集合)。每个集合中的资源将被最小化、合并、压缩和一起缓存,因此可以一次性请求。有关详细用法以及二进制/代码下载,请参阅项目 CodePlex 页面。该库使用很棒的YUI Compressor库进行最小化处理。

以发布模式部署生产代码

当我们在 Visual Studio 中开发 ASP.NET 应用程序时,debug 属性的默认值为 true。如果以默认的调试模式发布,这些设置在生产环境中性能会很差。因此,切勿以 debug 模式设置为 true 来发布您的网站或应用程序。在迁移到生产环境时,应在 web.config 中将其设置为 false

 <compilation debug="false" />

有关更多详细信息,请阅读此文

删除 ASP.NET 中的默认 HTTP 模块

在 .NET Framework 2.0 版本中,根 Web.config 文件中配置了以下默认 httpModules 元素。

 <httpModules>
     <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
     <add name="Session" type="System.Web.SessionState.SessionStateModule" />
     <add name="WindowsAuthentication" 
	type="System.Web.Security.WindowsAuthenticationModule" />
     <add name="FormsAuthentication" 
	type="System.Web.Security.FormsAuthenticationModule" />
     <add name="PassportAuthentication" 
	type="System.Web.Security.PassportAuthenticationModule" />
     <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
     <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />
     <add name="AnonymousIdentification" 
	type="System.Web.Security.AnonymousIdentificationModule" />
     <add name="Profile" type="System.Web.Profile.ProfileModule" />
</httpModules>   

您可以像这样在 web.config 中删除您不需要的模块。

 <httpModules>
  <remove name="PassportAuthentication" />
  <remove name="Profile" />
  <remove name="AnonymousIdentification" />
</httpModules>

有关更多详细信息,请阅读此文

优化 URL 生成

ASP.NET MVC 框架提供了以下生成 URL 的方法:

  1. Html.ActionLink()
  2. Html.RouteLink()
  3. Url.Action()
  4. Url.RouteUrl()

Html.RouteLink() 等同于 Html.ActionLink()

<%= Html.RouteLink("Click here", new {controller= "Weather", action= "GetWeather"}) %> 
       //will render the following <a href="/Weather/GetWeather">Click here</a>

同样,Url.RouteUrl() 等同于 Url.Action()

<%= Url.RouteUrl(new {controller= "Weather", action= "GetWeather"}) %> 
	will render the following /Weather/GetWeather

然而,这些方法可能会对您的应用程序产生性能影响。Chad Moran 在他的博客上进行了性能测试,并展示了如何通过优化 ASP.NET MVC 中的 URL 生成来提高性能。

有用链接

这里有一些有用的链接,供您阅读更多内容:

摘要

在本文中,我们探讨了如何利用 .NET Framework 中提供的缓存和 HTTP 压缩来提高 ASP.NET MVC 应用程序的性能。我们还研究了其他开源库,例如 JQuery 以及合并脚本和其他资源以提高 MVC 应用程序的性能。

© . All rights reserved.