改善ASP.NET2.0性能的五件法宝

来源:IT168  作者:seasky   发布时间:2007-12-05 19:26:42  浏览:
    大多数ASP.NET程序员都会遇到这样的问题,当我们的web程序开发周期快要结束的时候,却发现还有很多性能方面的问题需要解决。如果您遇到这样的情况,那真是太糟糕了。也许每一个开发人员在开发Web程序时都会制定一个目标,如使用适当的内存以及如何处理Web请求等。虽然这些目标已经制定,但可能仍然会因为使用某些错误的方法来改善应用程序的性能而使事情变得更糟糕。因此,在本文中将给出了五个步骤来优化ASP.NET2.0应用程序,希望这些要点会给读者以启迪,以便使广大的开发人员不会走弯路。

1. 适当地处理数据访问对象

    如果我们没有正确处理数据访问对象,就会大量消耗我们的服务器内存。当建立一个数据访问对象时,充分理解它们的生命周期以及不需要它们时如何处置是非常必要的。我经常看到很多开发人员建立、打开和销毁DataReader对象,但却不对它做任何处理。如果能确保我们的数据访问对象适当地被管理,这将在很大程度上解决IIS为什么直接机器快崩溃时才释放内存的另人头痛的问题。就先让我们在解决方案中查找关于DataReader实例吧,对于发现的每一个DataReader实例,请确保它们已经被关闭或是被释放。建议使用try/catch/finally块来处理。如下面代码所示: 2. 管理IIS应用程序池


    在典型的应用中,当处理一个Web应用程序时,这个Web程序由多个部分组成。通常有我们的主Web站点,一个或多个Web服务,或是一个图象处理程序。IIS6为我们提供了为多个应用程序建立程序池的机会。应用程序池允许我们使应用程序在各自的单独进程中运行。这么做的好处是将我们的应用程序的不同组成部分分开,使它们分别运行在自己的内存空间中。由于每个处理进程的内存达到800-900M时系统就会变得很慢,因此,需要应用程序分散到不同的处理进程中,这样每个工作进程占有的内存就不会那么大了。这样会从某种程度上提高系统运行的效率。关于如果建立应用程序池的问题,请参阅微软的相关技术文档。
3. 管理ASP.NET状态

    为了更进一步地改善应用程序性能,对ASP.NET的不同的状态类型有一个深入的了解是非常必要的。ASP.Net有许多不同的状态,但是我们应该弄清楚什么是应用程序状态、会话状态和profile属性。因为这些状态都保存在服务器的内存上。所有应尽量避免保存太多这三种状态的数据,除非有必要保存它们。如果我们需要在会话状态保存数据,就只存我们需要的数据,如标识字段或静态数据频繁被使用,因此,它们可以保存在会话状态中。现在网上有很多关于介绍ASP.NET这三种状态的文章,如果读者想更进一步发觉它们的潜力,可以阅读相关的资料。每一种状态都应该被使用在适合它们的地方。因此,花时间学习和理解它们是非常必要的。

    在这里我想给读者介绍另外一种状态,视图状态,这种状态将会影响客户端程序。这种状态被用来在aspx页中保存数据,或是在服务端和客户端之间传递数据。在默认情况下,视图状态对于ASP.NET和控件是开启的。但我们的Web页并不是都需要视图状态。如果都开启,在Web页中将会有非常多的数据保存在视图状态中。解决这个问题的一个正确方法就是使用“View Source"来控制我们的Web页哪块数据需要被存储。我们可以看看ASP.NET发送客户端的数据,在页的上端一大块被加密的数据就是视图状态。花一些时间来确定哪些数据需要视图状态的值得的。如果某些Web页和服务端没有任何数据交互,可以将这些页的视图状态关闭。视图状态很灵活,它可以关闭整个页,也可以只关闭被个用户控件,或是只打开某些控件的视图状态。如果我们关闭某个页面或控件的视图状态,其它的页面或控件可以保证正确的工作状态。

 

using (IDataReader reader = MySite.GetSearchResults()) { //Consume the datareader while (reader.Read()) { //Do something with the data } )
使用try/catch/finally 块

IDataReader reader; try { reader = MyWeb.GetSearchResults(); while (reader.Read()) { //Do something with the data } } catch (Exception ex) { //Log the exception } finally { //如果这个对象存在,dispose这个对象 if (reader != null) reader.Dispose(); }