温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ASP.NET局部缓存怎么优化

发布时间:2021-12-06 15:25:01 来源:亿速云 阅读:129 作者:iii 栏目:编程语言

这篇文章主要讲解了“ASP.NET局部缓存怎么优化”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET局部缓存怎么优化”吧!

一:局部缓存常用解决方案

针对上面的需求,有几类解决方案:

1、Client Side Includes(CSI):通过frame、iframe、 javascript、javacript+ajax等方式将另外一个页面的内容动态包含进来。像现在流行的jquery等javascript库对此有较好的支持。

优点:能够利用浏览器客户端并行处理及装载的机制;通过浏览器缓存机制可以降低网络传输时间,提高性能;计算放在客户端,能够降低服务器端压力

缺点:搜索引擎优化问题;javascript兼容性问题;客户端缓存可能导致服务器端内容更新后不能及时生效;XSS等安全隐患

2、Server Side Includes(SSI):

优点:SSI技术是通用技术,不受具体语言限制,只需要Web服务器或应用服务器支持即可,Ngnix、Apache、Tomcat、Jboss等对此都有较好的支持

缺点:SSI在语法上不能够直接包含其他服务器的url(当然也可以通过redirect等来变通实现),因此在需要充分利用缓存及负载均衡的环境下相对不是很灵活。

当然如果不使用单独的缓存服务器,而是使用Ngnix,利用Ngnix对SSI及Memcached支持,通过NginxHttpSsiModule、 NginxHttpMemcachedModule也可以实现页面缓存,但与专业的缓存服务器(例如Varnish)相比较,Ngnix作为缓存服务器只适合于中小规模的场合。

3、使用ASP.NET的片段缓存

可以利用用户控件将页面分段,在ascx文件中写入缓存的语句,而不在aspx文件中写缓存语句,这样ASP.NET就可以只缓存ascx片断的输出了。

缺点:片段缓存不支持Location特性;缓存页面片段惟一合法的地方是web服务器。这是因为片段缓存在ASP.NET中是新的功能,所以浏览器和代理服务器不支持。由于它不是W3C标准,像SQUID和VARNISH这样的代理服务器也不支持它。

4、Edge Side Includes (ESI):

Edge Side Includes(ESI) 和Server Side Includes(SSI) 和功能类似。SSI需要特殊的文件后缀(shtml,inc)。ESI可以直接通过URI包含远程服务器文件,ESI更适合用于缓存服务器上,缓存整个页面或页面片段,因此ESI特别适合用于缓存。本文要介绍的就是ESI的方式来支持局部缓存。

优点:ESI是一个W3C标准,被当下流行的缓存服务器SQUID,Varnish支持。

二:ESI的ASP.NET实现

本文所要阐述的是ESI局部缓存的实现。主页面(test1.aspx)前台:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test1.aspx.cs" Inherits="WebApplication2.aspx.test1" %> <%@ Import Namespace="System.Globalization" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <div>这里是局部缓存</div> <esi:include src="test2.aspx"/> <div>局部缓存结束</div> <%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%> </body> </html>

主页面的后台请参看上篇,对主页面采取了缓存策略,即在页面中使用esi:include标识。

被包含的页面(test2.aspx)的前台:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="test2.aspx.cs" Inherits="WebApplication2.aspx.test2" %>  <%@ Import Namespace="System.Globalization" %> <div>

局部缓存中的页面:

<%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%> </div>

被包含的页面的后台什么也不需要处理,也就是不为它加入任何缓存策略,该页面是实时的。

VARNISH配置文件如下:

backend default {  .host = "192.168.0.77";  .port = "80";  }  sub vcl_fetch {  remove beresp.http.Set-Cookie;  if(req.url ~ "test1.aspx") {  esi;  }  if(req.url ~ "test2.aspx"){  return (pass);  }  }  sub vcl_recv {  remove req.http.Cookie;  #remove req.http.Accept-Encoding;  #remove req.http.Vary;  }  sub vcl_hit {  if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){  set obj.ttl=0s;  return (restart);  }  return (deliver);  }  sub vcl_deliver {  if (obj.hits >0) {  set resp.http.X-Cache = "HIT";  } else {  set resp.http.X-Cache = "MISS";  }  }

上文的vcl_fetch函数中加了两个判断,指的是:如果碰到test1.aspx就处理esi标识,如果碰到test2.aspx,就直接忽略让后台IIS处理。

值得注意的是,启动命令中加入了-p选项(这是一个varnish的小问题,请查阅参考,此处不表):

varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -p esi_syntax=0x1 -s file,c:/varnish/var/cache,100M

三:效果

启动varnish后,我们发现,对于test2.aspx,由于我们使用了esi对其进行了包含,而test2.aspx又未进行缓存,所以在test1.aspx的缓存有效期内,随着每一次刷新,test1.aspx的内容没有变动,但是所包含的test2.aspx区域,会实时刷新。

感谢各位的阅读,以上就是“ASP.NET局部缓存怎么优化”的内容了,经过本文的学习后,相信大家对ASP.NET局部缓存怎么优化这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI