ASPNET 中包涵了很多秘密当你发现它时可以为你的程序带来更大的性能和扩展性提升例如了解了在Membership和Profile provider提供程序中所隐藏的秘密瓶颈后就可以方便地的解决验证问题并使得授权操作的速度加快
另外ASPNET HTTP管道为了避免针对每次请求所要执行的必要代码而发生阻塞不仅那样ASPNET工作者进程能够推动其限制而获得更高的性能页面碎片在浏览器端的输出缓存(不是在服务器端)可以显着节约回访者的下载时间按需求的用户界面下载可以让你的站点给人快速流畅的感觉
最后内容传输网络和HTTP缓存头的恰当使用可以让你的网站惊人的快速在这篇文章中你将学习到这些技术它能够使你的ASPNET应用程序获得更高的性能更好的扩展性 并且可以在任何ASPNET的网站上实现尤其是那些应用了ASPNET Membership 和Profile provider的站点
ASPNET管道优化
位于请求管道中的很多ASPNET默认的HttpModules用于拦截客户端所发出的每个请求例如SessionStateModule拦截每个请求并解析对应的会话cookie然后在HttpContext中加载适当的会话实时证明并不是所有的modules都是必要的
例如如果你不使用Membership和Profile provider提供程序那么你就可以不需要FormsAuthentication module如果你需要为你的用户使用Windows验证那么你就可以不需要WindowsAuthentication位于管道中的这些modules仅仅在每次请求到来时执行一些不必要的代码
默认的modules都定义在了nfig文件中(位于$WINDOWS$\MicrosoftNET\Framework\$VERSION$\CONFIG目录下)
<httpModules>
<add name=OutputCache type=SystemWebCachingOutputCacheModule />
<add name=Session type=SystemWebSessionStateSessionStateModule />
<add name=WindowsAuthentication
type=SystemWebSecurityWindowsAuthenticationModule />
<add name=FormsAuthentication
type=SystemWebSecurityFormsAuthenticationModule />
<add name=PassportAuthentication
type=SystemWebSecurityPassportAuthenticationModule />
<add name=UrlAuthorization type=SystemWebSecurityUrlAuthorizationModule />
<add name=FileAuthorization type=SystemWebSecurityFileAuthorizationModule />
<add name=ErrorHandlerModule type=SystemWebMobileErrorHandlerModule
SystemWebMobile Version=
Culture=neutral PublicKeyToken=bfffdaa />
</httpModules>
你可以通过在站点的nfig文件中添加<remove>节点到你的网站应用程序中来删除这些默认的modules例如
<httpModules><! Remove unnecessary Http Modules for faster pipeline ><remove name=Session /><remove name=WindowsAuthentication /><remove name=PassportAuthentication /><remove name=AnonymousIdentification /><remove name=UrlAuthorization /><remove name=FileAuthorization /></httpModules>
上面的配置对于使用了数据库并基于Forms验证的网站来说非常适合它们并不需要任何会话的支持因此所有这些modules都可以安全的删除
ASPNET 进程配置优化
ASPNET进程模型配置定义了一些进程级别的属性像ASPNET使用的线程数量超时前阻止线程花费了多长时间多少请求在继续等待IO工作完成等等默认情况下很多方面都具有太多的限制当今硬件已经变得十分便宜了即使是采用双核多GB的RAM服务器也变得非常平常的选择了
因此进程模型配置能够减少ASPNET进程消耗更多的系统资源并提供为每台服务器提供更好的扩展性
执行一次规则的ASPNET安装将会在nfig文件中创建如下配置的节点
<systemweb><processModel autoConfig=true />
你需要减少这种自动配置并针对不同的特性使用一些特定的值以便自定义ASPNET工作者进程的工作方式例如
<processModel
enable=true
timeout=Infinite
idleTimeout=Infinite
shutdownTimeout=::
requestLimit=Infinite
requestQueueLimit=
restartQueueLimit=
memoryLimit=
webGarden=false
cpuMask=xffffffff
userName=machine
password=AutoGenerate
logLevel=Errors
clientConnectedCheck=::
comAuthenticationLevel=Connect
comImpersonationLevel=Impersonate
responseDeadlockInterval=::
responseRestartDeadlockInterval=::
autoConfig=false
maxWorkerThreads=
maxIoThreads=
minWorkerThreads=
minIoThreads=
serverErrorMessageFile=
pingFrequency=Infinite
pingTimeout=Infinite
asyncOption=
maxAppDomains=
/>
除了下面几个不为默认值以外其余均为系统默认值
maxWorkerThreads
每次处理默认为在一台双核的计算机上ASPNET的处理就需要了这意味着ASPNET在一台并行的双核服务器上可以每次处理个请求我将数量增加到以便为ASPNET的每次处理提供更多的线程如果你有一个应用程序它的CPU处理能力并不是很强但是它却能够每秒更容易地处理多个请求那么你就可以增加这个值
尤其是你的Web应用程序使用了大量的Web服务调用或者下载/上传了很多不会对CPU产生压力的数据时当ASPNET用完这些工作者线程时它会停止出来发来的多个请求此时请求会放置到一个队列中并持续等待直到出现一个空闲的工作者线程通常到你的站点开始接受超过预期的点击时会发生这样的情况那样的话如果你需要节省CPU的使用可以增加每次处理的工作者线程数来达到目的
maxIOThreads
每次处理默认为在一台双核的计算机上ASPNET进行的I/O操作就需要个线程了这意味着ASPNET在一台并行的双核服务器上可以每次处理个I/O请求I/O请求能够进行的文件读/写数据库操作web服务调用从Web 应用程序中产生的HTTP请求等等因此如果你的服务器有足够的系统资源来处理更多的I/O请求你可以将该值设置为特别是当你的Web应用程序在并行模式下进行下载/上传数据调用很多外部Web服务时非常有用
minWorkerThreads
当空闲的ASPNET工作者线程数量低于这个数字时ASPNET就会开始将这些发来的请求推入队列中因此你可以为改值设定一个较低的值以便可以增加当前请求的数量此外建议不要将该值设置得过低因为Web应用程序的代码可能需要做一些后台处理和并行处理此时会需要更多的空闲工作者线程支持
minIOThreads
除了它是针对I/O线程以外其它与minWorkerThreads的方式相同然而你可以将该值设置得比minWorkerThreads还低因为就I/O线程而言这里不会发生并行处理的问题
memoryLimit
指定内存大小所允许的最大值作为整个系统内存的百分比以便ASPNET在启动一个新的进程并重新分派存在的请求之前这些工作者进程能够进行消费如果在你的服务器上仅仅只运行了你的网站应用程序而且没有其它的进程需要RAM你可以设置一个更高的值比如
然而如果你同时有一个会发生内存洩漏的应用程序那么最好是把该值设置为一个较低的值以便在出现大问题之前洩漏的内存能得到及时的回收从而保持你的站点稳定尤其是当你使用COM组件并发生内存洩漏时然而这只是针对该问题的一个临时解决方案当然需要你去解决洩漏问题
除了processModel以外另外还有一个非常重要的节点你能够指定发出请求作为单独IP的最大数量
<><connectionManagement><add address=* maxconnection= /></connectionManagement></>
默认值为设置得比较低这就意味着你不能从你的Web应用程序用一个IP地址同时链接多于个的链接站点获得外部内容很多都是由于默认设置而遭到阻塞这里我将其设置为如果你的Web应用程序会对某一个指定的服务器进行大量的调用你甚至可以考虑设置一个更高的值