如何提高asp.net应用程序性能和可扩展性

 我来答
硪丨暧恋
2017-06-06 · TA获得超过8980个赞
知道大有可为答主
回答量:5336
采纳率:93%
帮助的人:2173万
展开全部
Asp.net有很多值得你挖掘的“秘密”,当你发现了它们,将会给你网站的性能和可扩展性带来巨大提升!例如,对于Membership以及Profile提供程序有一些秘密的瓶颈,它们很容易被解决,从而使认证和授权更加快速。另外,asp.net的http管线可以为每一个请求作处理,防止执行了某些不必要的代码而遭受攻击。不只是这些,asp.net工作进程能够突破默认限制,从而完全发挥它的威力。在浏览器端(不是在服务器端)的页面分段输出缓存能显著减少由于请求访问所需要占用的大量下载时间。在需要的用户界面上的加载能够给你的网站带来快速而平稳的体验。最后,内容分发网络(CDN)以及对HTTP缓存头的正确使用能够使你的网站得到快速响应。

在这篇文章中,你将学习这些技术,给你的asp.net应用程序性能和可扩展性带来巨大的提升。下面是接下来将要讨论的技术:

Asp.net管线优化 Asp.net进程配置优化 Asp.net网站上线之前你必须要做的事 内容分发网络(CDN)
浏览器端缓存Ajax调用 最大限度地正确使用浏览器缓存 在需要的UI上逐步加载以提供快速平滑的体验 优化asp.net 2.0Profile
提供程序 怎样在不“下线”站点的情况下查询asp.net 2.0的Membership表 防止拒绝服务攻击

上面的技术都能够在任何的asp.net网站中实现,特别是那些使用了asp.net 2.0的Membership以及Profile 提供程序的网站。

Asp.net管线优化

有一些asp.net默认的HttpModules被设置在请求管线中,它们会参与每一个请求。例如,SessionStateModule会处理每一个请求,转换会话cookie然后给HttpContext加载适当的session。不是所有的这些模块都总是被需要的。例如,如果你没有使用Membership
以及 Profile
provider,你就不需要FormsAuthentication模块。如果你没有对你的用户使用Windows认证,你就不需要WindowsAuthentication模块。这些模块只是被安置在管线之内,对每一个请求执行某些不是必须要的代码。

这些默认模块被定义在machine.config文件中(位于$WINDOWS$\Microsoft.NET\Framework\$VERSION$\CONFIG directory)

上面的配置非常适合那些使用数据库并基于Forms认证,并且不需要任何Session支持的网站。所以,所有上面这些模块都能够被安全地移除。

Asp.net进程配置优化

Asp.net进程模型配置定义了一些进程级别的属性,例如asp.net使用了多少线程数,在超时之前它会阻塞线程多久,允许多少请求
等待I/O工作完成等。这些默认的配置在很多情况下有太多的限制。现在,硬件已经变得相当便宜,技嘉科技的双核RAM服务器已经变成了非常普遍的选择。所以,进程模型配置可以配置得让asp.net线程使用更多的系统资源,并为每一个服务器提供更好的扩展性。

一个通常的asp.net的安装将按如下的配置创建一个machine.config:

这里除了以下的一些值,其他值都是默认值:

maxWorkerThreads-对每个进程来说20是默认值。在一个双核计算机上,将会给asp.net分配40个线程。这意味着asp.net一台双核机器上一次能够并行处理40个请求在。我将它增加到100,给予asp.net每个进程更多的线程。如果你有一个不是CPU密集型应用程序,可以很容易地处理更多地请求量,那么你可以增加该值。特别是如果你的Web应用程序使用许多Web

Service调用或者下载/上传的许多数据没有给CPU带来压力的话。当asp.net运行超过它允许的工作线程数,它将会停止处理更多到来的请求。请求被放进一个队列中,并保持等待知道一个工作线程被释放。当你的站点开始遭受比你预期的更多的攻击时,通常会发生这样的情况。如果遇到这种情况,如果你的CPU有空闲,给每个进程(asp.net进程)增加工作线程数。maxIOThreads-对每个进程来说20是默认值。在一个双核计算机上,将会给asp.net分配40个线程来进行I/O操作。这意味着在一台双核服务器上asp.net一次可以并行处理40个I/O请求。I/O请求可能是文件的读写、数据库操作、Web

Service的调用Web应用程序内部生成的Http请求等。所以,你可以将它设置为100,如果你的服务器有足够的系统资源来处理更多的I/O请求的话。特别是,当你的Web应用程序经常下载或上传数据,并行调用许多外部的webservice时,效率提升会很明显。minWorkerThreads-当可用的asp.net工作线程数下降到该值以下时,asp.net开始将即将到来的请求压入队列。所以你可以将该值设置为一个很低的数字来增加可被处理的当前请求的数目。然而,不要将它设置地过低,因为Web应用程序代码可能需要做某些后台处理以及某些并行处理需要一定数量的空闲工作线程。minIOThreads-与minWorkerThreads相同,但这个值涉及的是I/O线程数。但是,你可以给它设置一个比minWorkerThreads更低得数字,因为没有发生在I/O线程上并行处理的情况。momoryLimit-指定允许使用内存大小的最大值,是与系统总内存的百分比。它是在asp.net在启动一个新进程和重新分配正在处理的请求之前工作进程可以消耗的内存大小。如果只有你的Web应用程序允许在一个“专用的盒子里”并且没有其他的进程需要RAM,你可以设置它为一个很高的值,比如80。但是,如果你有一个内存泄露的应用程序总是不断泄露内存,最好将它设置为一个低一点的值,以便泄露内存的进程可以在它变得无法处理之前尽快被彻底回收。特别是,当你正在使用一个COM组件并且它产生内存泄露时,就会遇到这种情况。

除了processModel节点,还有一个非常重要的节点——system.net,你可以指定给一个IP它能外发请求数的最大值。

无论什么时候一个页面的请求完成之后,ProfileProvider将自动地保存profile。所以,这可能导致你数据库的一个不必要的更新,它有很显著的性能损失!关闭自动保存并且在你的代码中使用Profile.Save()明确地完成。

上面的三个设置主要是为了高访问量的网站。

内容分发网络

来自浏览器的每一个请求都是通过了跨越世界的骨干网到达你的服务器的。请求需要经过一定数量的国家、大陆、海洋才传递给你的服务器,所以它会变得很慢。例如,如果你将你的服务器架在USA,并且一些人在澳大利亚浏览你的网站,每一个请求都从地球的一端到另一段才能到达你的服务器,然后再返回给浏览器。如果你的站点有很大数量的静态文件,像图片、CSS、Javascript。为它们发送请求,跨越世界去下载它们,将会花费大量的时间。如果你能够在澳大利亚架设一台服务器,并且重定向用户到你在澳大利亚的服务器上去,那每一个这样的请求将比到达美国花费更少的时间。不仅网络延迟会更小,数据传输的路由也将更为快速,因此静态内容将能够以更快的速度下载。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式