一起谈.NET技术,构建高性能ASP.NET站点之减少不必要的请求

简介:   前言:本篇的一些内容比较的有意思,总结了可能平时大家可以注意到的一些优化点,而且非常的实用。  本篇的议题如下:  识别和分析服务端的性能瓶颈(上)  内存(前篇)  缓存(前篇)  CPU(后篇)  处理请求线程(后篇)  提高性能的一些简单改进措施(下)  部署优化(前篇)  减少不必要回传(前篇)  减少不必要的请求(后篇)  搜索引擎问题  热链接问题  验证码(CAPTCHA)  网络刮刀   服务端的要处理的请求越多,无疑服务端的压力也就越大,尤其是有些请求需要访问一些比较昂贵的资源,例如数据库,服务端的文件等。

  前言:本篇的一些内容比较的有意思,总结了可能平时大家可以注意到的一些优化点,而且非常的实用。

  本篇的议题如下:

  识别和分析服务端的性能瓶颈(上)

  内存(前篇)

  缓存(前篇)

  CPU(后篇)

  处理请求线程(后篇)

  提高性能的一些简单改进措施(下)

  部署优化(前篇)

  减少不必要回传(前篇)

  减少不必要的请求(后篇)

  搜索引擎问题

  热链接问题

  验证码(CAPTCHA)

  网络刮刀

  服务端的要处理的请求越多,无疑服务端的压力也就越大,尤其是有些请求需要访问一些比较昂贵的资源,例如数据库,服务端的文件等。但是我们必须知道,在到达服务端的请求中,有些请求时我们希望的,例如网站的用户的请求,有些请求其实是不必要,甚至是我们不想要的,为此,我们要避免这样的请求,节省服务端的资源,从而提高性能。

  搜索引擎

  首先来看看有关搜索引擎的问题。

  然后搜索引擎爬到我们的站点是一件好的事情,很多的SEO可以进行,推广站点。同时,在站点中,有些文件或者资源比较的私密,或者我们不希望被搜索引擎请求和收录的,因为每次搜索引擎在请求这些资源的时候,就是发送请求到我们的站点服务器,势必会加重服务器的负载。

  不需要被搜索引擎请求的文件一般如下:

  1. 图片资源

  2. Js脚本,css等

  3. 一些需要身份验证或者授权才能看的页面(如果页面需要验证之后才能看,搜索引擎收录了也作用不大)

  我们可以设置一下,告诉搜索引擎的蜘蛛程序如何爬我们的站点。

  步骤如下:

  1. 在站点的根目录下面,创建一个robots.txt的文件。

  2. 写入文件。如果我们希望阻止所有的搜索引擎来爬我们的站点的页面,那么就可以在文件中写入下面的配置:

  User-agent: *

  Disallow: /

  如果希望阻止搜索引擎爬某个文件夹,可以配置如下:

  User-agent: *

  Disallow: /images/

  Disallow: /js/

  Disallow: /css/

  Disallow: /private/

  更有趣的是:对于某些搜索引擎,我们还可以改变他们的蜘蛛程序爬我们站点的频率,设置如下:

  User-agent: *

  Crawl-delay: 10

  大家可以去上网找下一些如何影响Google,百度等蜘蛛程序的设置。

  热链接问题

  就是在A网站上面显示一个来自B网站的图片链接。例如我们在自己的站点上面有一个链接如下:img src=http://www.xxx.com/yyy.gif/,那么在别人在浏览我们的站点的时候,就回去别人的那个站点(http://www.xxx.com/yyy.gif)去请求这个图片,那么势必会消耗他们的服务器的资源。发过来,如果别人在他们的站点上采用了我们的图片或者其他的链接资料,那么用户在浏览别人的站点的时候就会消耗我们站点的服务端资源和带宽。

  为一个组件就可以阻止这种情况的发生:http://www.iis.net/community/default.

aspx?tabid=34i=1288g=6.大家去看看。

  验证码(CAPTCHA)

  我们常常在站点中加入一些验证码的功能来防止网络注册机。一般是生成一张有文字的图片,然后根据验证用户输入的文字和图片中的文字是否一样来判断此时的用户是人还是注册机。

  通过验证码阻止了注册机随意的消耗站点资源(如果没有验证码,注册机可以不断的注册信息,大小服务器和数据库资源,而且产生很多的垃圾数据)。

  我们自己写生成验证码的程序,一般通过GDI+来做,同时也可以采用一些第三方的库实现,例如:reCAPTCHA: http://recaptcha.net/,大家上网找下,很多的。

  网络刮刀(Scrapers)与Dos

  这个问题必须引起重视。如果我们的站点上面有很多的有用的信息,那么别人可能就可能开发一个程序来到我们的站点抓取信息,然后把这些内容放到自己的站点上面。例如,很多的内容型的站点每天都从博客园的首页上面来抓取信息,然后放到他们的站点上,增加他们的访问量。

  本来站点被搜索引擎抓就有点消耗性能了,如果还被很多的这样的网络刮刀来抓内容,对站点的性能影响可想而知。

  如果那些网络刮刀程序的的IP地址变化不频繁,而且请求我们站点的频率比较的由规律,那么我们就可以采用一些代码的方式来防止这样的请求。例如,我们可以监测:同一个IP是否在20min之内发送了100个请求,如果是,我们就推测:可能是别人在抓我们的站点内容,我们就拒绝这个IP的请求。

  当然了,上面只是一些简单的方法,对于一些复杂的Dos攻击,上面的监测代码基本没有作用。因为Dos攻击中,攻击的IP地址是变化的。

  下面我们就写一些代码来防止简单的网络刮刀程序和简单的Dos攻击。基本的思想就是:如果在给定的时间段内,如果某个用户的请求很多,超过了一定的数量,那么我们就认为这个用户可能是网络刮刀程序,然后就拒绝下面的请求,一段时间之后,再次允许这个从这个IP发出的请求。

  下面的代码中:假设如果一个用户在5秒之内发出了100个请求,那么我们就认为这是网络刮刀程序或者是网站的攻击者。当然,我们还考虑这个发送请求的用户是否是搜索引擎的蜘蛛程序。(下面的代码只是简单作为演示,不是实际生产的代码,抛砖引玉)

 
 
1 . private const int intervalSeconds = 30 ;
2 . private const int maxRequestsInInterval = 5 ;

  如果认为这个用户是攻击者,那么我们就阻止用户的请求,阻止时间是20秒

 
 
1 . private const int blockedPeriodSeconds = 20 ;

  下面,我们创建一个类来描述一个访问者的信息。如下:

 
 
1 . private class VisitorInfo
2 . {
3 . public int nbrHits;
4 . public bool blocked;
5 .
6 . public VisitorInfo()
7 . {
8 . nbrHits = 1 ;
9 . blocked = false ;
10 . }
11 . }

  在BotDefence类中加入一个方法IsBotAttach来判断一个请求是否是攻击性的请求。如下:

 
 
1 . public static bool IsDosAttack()
2 . {
3 . string visitorIP = HttpContext.Current.Request.UserHostAddress;
4 .
5 . VisitorInfo visitorInfo = (VisitorInfo)HttpContext.Current.Cache[visitorIP];
6 . if (visitorInfo == null )
7 . {
8 . HttpContext.Current.Cache.Insert(
9 . visitorIP, new VisitorInfo(), null ,
10 . DateTime.Now.AddSeconds(intervalSeconds),
11 . System.Web.Caching.Cache.NoSlidingExpiration);
12 . }
13 . else
14 . {
15 . if (visitorInfo.blocked)
16 . {
17 . return true ;
18 . }
19 .
20 . visitorInfo.nbrHits ++ ;
21 . if (visitorInfo.nbrHits   maxRequestsInInterval)
22 . {
23 . visitorInfo.blocked = true ;
24 . HttpContext.Current.Cache.Insert(
25 . visitorIP, visitorInfo, null ,
26 . DateTime.Now.AddSeconds(blockedPeriodSeconds),
27 . System.Web.Caching.Cache.NoSlidingExpiration);
28 . return true ;
29 . }
30 . }
31 . return false ;
32 . }

  上面的代码都是自解释的,很容易看懂,就不赘述了。

目录
相关文章
|
3天前
|
人工智能 开发框架 量子技术
【专栏】.NET 技术:驱动创新的力量
【4月更文挑战第29天】.NET技术,作为微软的开发框架,以其跨平台、开源和语言多样性驱动软件创新。它在云计算、AI/ML、混合现实等领域发挥关键作用,通过Azure、ML.NET等工具促进新兴技术发展。未来,.NET将涉足量子计算、微服务和无服务器计算,持续拓宽软件开发边界,成为创新的重要推动力。掌握.NET技术,对于开发者而言,意味着握有开启创新的钥匙。
|
3天前
|
开发框架 .NET C#
【专栏】理解.NET 技术,提升开发水平
【4月更文挑战第29天】本文介绍了.NET技术的核心概念和应用,包括其跨平台能力、性能优化、现代编程语言支持及Web开发等特性。文章强调了深入学习.NET技术、关注社区动态、实践经验及学习现代编程理念对提升开发水平的重要性。通过这些,开发者能更好地利用.NET构建高效、可维护的多平台应用。
|
3天前
|
机器学习/深度学习 vr&ar 开发者
【专栏】.NET 技术:引领开发新方向
【4月更文挑战第29天】本文探讨了.NET技术如何引领软件开发新方向,主要体现在三方面:1) 作为跨平台开发的先锋,.NET Core支持多操作系统和移动设备,借助.NET MAUI创建统一UI,适应物联网需求;2) 提升性能和开发者生产力,采用先进技术和优化策略,同时更新C#语言特性,提高代码效率和可维护性;3) 支持现代化应用架构,包括微服务、容器化,集成Kubernetes和ASP.NET Core,保障安全性。此外,.NET还不断探索AI、ML和AR/VR技术,为软件开发带来更多创新可能。
|
3天前
|
开发框架 Cloud Native 开发者
【专栏】剖析.NET 技术的核心竞争力
【4月更文挑战第29天】本文探讨了.NET框架在软件开发中的核心竞争力:1) .NET Core实现跨平台与云原生技术的融合,支持多操作系统和容器化;2) 提升性能和开发者生产力,采用JIT、AOT优化,提供C#新特性和Roslyn编译器平台;3) 支持现代化应用架构,包括微服务和容器化,内置安全机制;4) 丰富的生态系统和社区支持,拥有庞大的开发者社区和微软的持续投入。这些优势使.NET在竞争激烈的市场中保持领先地位。
|
3天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
48 0
|
3天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0
|
3天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
32 0
|
3天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
122 5
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
126 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0

相关实验场景

更多