构建“.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 . 上海企业网站设计与制作an>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 上海闵行企业网站设计与制作e="color: #000000;">. 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 上海网站建设="color: #000000;">;
29 . }
30 . }
31 . return false ;
32 . }

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

目录
相关文章
|
2月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
118 10
|
1天前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
19 5
|
2月前
|
开发框架 前端开发 .NET
VB.NET中如何利用ASP.NET进行Web开发
在VB.NET中利用ASP.NET进行Web开发是一个常见的做法,特别是在需要构建动态、交互式Web应用程序时。ASP.NET是一个由微软开发的开源Web应用程序框架,它允许开发者使用多种编程语言(包括VB.NET)来创建Web应用程序。
55 5
|
1月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
21 0
|
3月前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
135 0
|
3月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
40 0
|
3月前
|
微服务 API Java
微服务架构大揭秘!Play Framework如何助力构建松耦合系统?一场技术革命即将上演!
【8月更文挑战第31天】互联网技术飞速发展,微服务架构成为企业级应用主流。微服务将单一应用拆分成多个小服务,通过轻量级通信机制交互。高性能Java Web框架Play Framework具备轻量级、易扩展特性,适合构建微服务。本文探讨使用Play Framework构建松耦合微服务系统的方法。Play采用响应式编程模型,支持模块化开发,提供丰富生态系统,便于快速构建功能完善的微服务。
47 0
|
3月前
|
SQL 开发框架 .NET
代码更简洁,开发更高效:从零开始使用Entity Framework Core与传统ADO.NET构建数据持久化层的比较
【8月更文挑战第31天】在.NET平台上开发数据驱动应用时,选择合适的ORM框架至关重要。本文通过对比传统的ADO.NET和现代的Entity Framework Core (EF Core),展示了如何从零开始构建数据持久化层。ADO.NET虽强大灵活,但需要大量手写代码;EF Core则简化了数据访问,支持LINQ查询,自动生成SQL命令,提升开发效率。从创建.NET Core项目、定义数据模型、配置`DbContext`到执行数据库操作,EF Core提供了一套流畅的API,使数据持久化层的构建变得简单直接。
34 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
54 0