ASP.NET性能优化之减少请求

简介:

1:减少静态页面请求

要让静态页面支持这个需求,我们需要用到http头中的Cache-Control: max-age。值得注意的是Cache-Control是在HTTP/1.1协议下的标识,它是HTTP/1.0协议中的Expires的升级。为了让静态页支持Cache-Control,一种方案是在IIS中进行设置,如下,我在需要静态缓存的页面或者文件夹上右键->属性:

image

我在这里将过期时间设置为1分钟,然后,我们通过HttpWatch观察IE请求该页面(第一次请求),得到的HTTP头如下:

image

可以看到其得到的http头中已经有了Cache-Control: max-age=60这一项。

现在,我需要在1分钟内反复请求该静态页,请求的行为我们分别通过下面几种方式来实现,

F5 代表浏览器的一次刷新,它对Last-Modified有效,但是对Cache-Control无效
点击“转到”或者光标移入地址栏然后回车 对Cache-Control有效
CTRL+F5 强制刷新,返回所有正文

我们通过HttpWatch得到的结果如下:

image

需要注意我在图中用红字和红框的标识:

首次请求 返回状态码200,显然得到全部正文,为545字节。
F5 刷新,对Last-Modified有效,它是让服务器判断是否需要读取缓存,所以,依然存在请求和返回数据,我们可以看到,分别是352和239。状态码是304。
点击“转到”或者光标移入地址栏然后回车 对Cache-Control有效,是浏览器自己决定是否读取缓存,由于是在1分钟内,所以,浏览器没有向WEB服务器发送请求,我们可以看到send和receive的数据全部是0。无交互,故无状态码。
ctrl+f5 相当于是强制刷新,所以状态码200OK,返回全部正文数据,我们可以看到和第一次请求是一样的,为545字节。

(题外话,上面的图中有一个针对favicon.ico的404,我们应该始终为网站提供favicon.ico,它是你可以设置的网站LOGO,不然有些浏览器会反复去请求该LOGO,这也会带来性能损耗)。

经过上面的处理后,可以遇见我们相比上一篇更进一步减少了HTTP请求,提升了效率,因为总有一些用户会通过“转到”或者光标移入地址栏然后回车去请求数据。我们可以根据实际需求去设定特定页面的缓存时间。

1.1 通过web.config设置静态文件缓存

在上面的示例中,我们通过IIS设置了静态文件的缓存,也可以在web.config中进行设置,如下(在<configuration>下):

< system.webServer >
   < validation  validateIntegratedModeConfiguration="false"/>
   < modules  runAllManagedModulesForAllRequests="true"/>
   < staticContent >
     < clientCache  cacheControlMode="UseMaxAge" cacheControlMaxAge="0.00:00:60"/>
   </ staticContent >
</ system.webServer >

1.2 关闭静态文件缓存

也可以对单独的文件夹或者文件关闭缓存,如下设置(在<configuration>下):

< location  path="test2.htm">
   < system.webServer >
     < staticContent >
       < clientCache  cacheControlMode="DisableCache"/>
     </ staticContent >
   </ system.webServer >
</ location >

 

2:减少动态页面请求

有了对以上静态页面或者说资源的分析之后,我们知道,可以对动态页面请求采用相同的策略,这需要我们自己写代码实现:

protected  void  Page_Load( object  sender, EventArgs e)
{
     //处理点击“转到”或者光标移入地址栏然后回车,也就是本文所阐述的
     this .Response.AddHeader( "Cache-Control" , "max-age=60" );
     //真是用来处理F5刷新的,也就是对Last-Modified有效
     this .Response.AddHeader( "Last-Modified" , DateTime.Now.ToString( "U" , DateTimeFormatInfo.InvariantInfo));
     DateTime IfModifiedSince;
     if  (DateTime.TryParse( this .Request.Headers.Get( "If-Modified-Since" ), out  IfModifiedSince))
     {
         if  ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 60)
         {
             Response.Status = "304 Not Modified" ;
             Response.StatusCode = 304;
             return ;
         }
     }
}

结果如下:

image

该结果与我们使用静态页面完全一致。

2.1使用配置文件配置

也可以在配置文件中批量对动态文件进行配置,如下:

< system.web >
   ……
   < caching >
     < outputCacheSettings >
       < outputCacheProfiles >
         < add  name="cache1" duration="60" location="Client" varyByParam="none"/>
       </ outputCacheProfiles >
     </ outputCacheSettings >
   </ caching >
</ system.web >

然后在页面前台引用:

<%@ OutputCache CacheProfile="cache1" %>

本文代码比较简单,关键是要体会其中所蕴含的思想,即:把浏览器当成你的网站的缓存的极其重要的一部分。

备注

在本篇中,我使用了AddHeader来进行http头的添加,上篇中有朋友提出来使用Response.Cache.SetMaxAge方法,需要提醒的是,使用该方法,将导致丢失304状态。深层次原因不再细究。


本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/09/14/2174751.html,如需转载请自行联系原作者

相关文章
|
开发框架 中间件 .NET
ASP.NET Core 请求处理管道
ASP.NET Core (请求处理管道) 了解ASP.NET处理管道为了理解ASP.NET Core中的请求处理管道概念,让我们修改Startup类的Configure()方法,如下所示。 在这里,我们将三个中间件组件注册到请求处理管道中。 如您所见,前两个组件是使用Use() 扩展方法注册的,因此它们有机会在请求处理管道中调用下一个中间件组件。 最后一个使用Run() 扩展方法注册,因...
51 0
ASP.NET Core 请求处理管道
|
关系型数据库 MySQL 数据库
找不到请求的 .Net Framework Data Provider。可能没有安装
做的一个项目,框架为.net framework 数据库为mysql 出现如标题错误 检查是否安装mysql、是否安装mysql connector net 笔者是因为没有安装后者mysql connector net 下载地址: [mysql connector net](https://downloads.mysql.com/archives/c-net/ "mysql connector net") 笔者安装截图如下: ![请在此添加图片描述](https://developer-private-1258344699.cos.ap-guangzhou.myqcloud.com/c
261 0
|
9天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
51 2
|
5月前
|
开发框架 缓存 .NET
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
239 0
|
5月前
|
数据采集 JSON API
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
本文探讨了在.NET环境下,如何通过异步方法和HTTP请求提高Web爬虫的响应速度和数据抓取效率。介绍了使用HttpClient结合async和await关键字实现异步HTTP请求,避免阻塞主线程,并通过设置代理IP、user-agent和cookie来优化爬虫性能。提供了代码示例,演示了如何集成这些技术以绕过目标网站的反爬机制,实现高效的数据抓取。最后,通过实例展示了如何应用这些技术获取API的JSON数据,强调了这些方法在提升爬虫性能和可靠性方面的重要性。
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
|
3月前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
45 0
|
5月前
|
数据采集 API 开发者
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
在.NET 8中,通过`ConfigurePrimaryHttpMessageHandler`方法,开发者能更精细地控制HTTP请求,这对于构建高效爬虫尤为重要。此特性支持定制代理IP、管理Cookie与User-Agent,结合多线程技术,有效应对网络限制及提高数据采集效率。示例代码展示了如何设置代理服务器、模拟用户行为及并发请求,从而在遵守网站规则的同时,实现快速稳定的数据抓取。
.NET 8新特性:使用ConfigurePrimaryHttpMessageHandler定制HTTP请求
|
5月前
|
数据采集 开发框架 .NET
HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求
在现代Web开发中,高效可靠的HTTP请求对应用性能至关重要。ASP.NET Core提供的`HttpClient`是进行这类请求的强大工具。本文探讨其最佳实践,包括全局复用`HttpClient`实例以避免性能问题,通过依赖注入配置预设头部信息;使用代理IP以防IP被限制;设置合理的`User-Agent`和`Cookie`来模拟真实用户行为,提高请求成功率。通过这些策略,可显著增强爬虫或应用的稳定性和效率。
126 0
HttpClient在ASP.NET Core中的最佳实践:实现高效的HTTP请求
|
5月前
.NET Core 在其上下文中,该请求的地址无效。
.NET Core 在其上下文中,该请求的地址无效。
53 0
|
8月前
|
JSON 编解码 Go
Golang深入浅出之-HTTP客户端编程:使用net/http包发起请求
【4月更文挑战第25天】Go语言`net/http`包提供HTTP客户端和服务器功能,简化高性能网络应用开发。本文探讨如何发起HTTP请求,常见问题及解决策略。示例展示GET和POST请求的实现。注意响应体关闭、错误处理、内容类型设置、超时管理和并发控制。最佳实践包括重用`http.Client`,使用`context.Context`,处理JSON以及记录错误日志。通过实践这些技巧,提升HTTP编程技能。
87 1