溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET局部緩存怎么優(yōu)化

發(fā)布時間:2021-12-06 15:25:01 來源:億速云 閱讀:129 作者:iii 欄目:編程語言

這篇文章主要講解了“ASP.NET局部緩存怎么優(yōu)化”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“ASP.NET局部緩存怎么優(yōu)化”吧!

一:局部緩存常用解決方案

針對上面的需求,有幾類解決方案:

1、Client Side Includes(CSI):通過frame、iframe、 javascript、javacript+ajax等方式將另外一個頁面的內(nèi)容動態(tài)包含進來。像現(xiàn)在流行的jquery等javascript庫對此有較好的支持。

優(yōu)點:能夠利用瀏覽器客戶端并行處理及裝載的機制;通過瀏覽器緩存機制可以降低網(wǎng)絡(luò)傳輸時間,提高性能;計算放在客戶端,能夠降低服務(wù)器端壓力

缺點:搜索引擎優(yōu)化問題;javascript兼容性問題;客戶端緩存可能導(dǎo)致服務(wù)器端內(nèi)容更新后不能及時生效;XSS等安全隱患

2、Server Side Includes(SSI):

優(yōu)點:SSI技術(shù)是通用技術(shù),不受具體語言限制,只需要Web服務(wù)器或應(yīng)用服務(wù)器支持即可,Ngnix、Apache、Tomcat、Jboss等對此都有較好的支持

缺點:SSI在語法上不能夠直接包含其他服務(wù)器的url(當(dāng)然也可以通過redirect等來變通實現(xiàn)),因此在需要充分利用緩存及負載均衡的環(huán)境下相對不是很靈活。

當(dāng)然如果不使用單獨的緩存服務(wù)器,而是使用Ngnix,利用Ngnix對SSI及Memcached支持,通過NginxHttpSsiModule、 NginxHttpMemcachedModule也可以實現(xiàn)頁面緩存,但與專業(yè)的緩存服務(wù)器(例如Varnish)相比較,Ngnix作為緩存服務(wù)器只適合于中小規(guī)模的場合。

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

可以利用用戶控件將頁面分段,在ascx文件中寫入緩存的語句,而不在aspx文件中寫緩存語句,這樣ASP.NET就可以只緩存ascx片斷的輸出了。

缺點:片段緩存不支持Location特性;緩存頁面片段惟一合法的地方是web服務(wù)器。這是因為片段緩存在ASP.NET中是新的功能,所以瀏覽器和代理服務(wù)器不支持。由于它不是W3C標(biāo)準(zhǔn),像SQUID和VARNISH這樣的代理服務(wù)器也不支持它。

4、Edge Side Includes (ESI):

Edge Side Includes(ESI) 和Server Side Includes(SSI) 和功能類似。SSI需要特殊的文件后綴(shtml,inc)。ESI可以直接通過URI包含遠程服務(wù)器文件,ESI更適合用于緩存服務(wù)器上,緩存整個頁面或頁面片段,因此ESI特別適合用于緩存。本文要介紹的就是ESI的方式來支持局部緩存。

優(yōu)點:ESI是一個W3C標(biāo)準(zhǔn),被當(dāng)下流行的緩存服務(wù)器SQUID,Varnish支持。

二:ESI的ASP.NET實現(xiàn)

本文所要闡述的是ESI局部緩存的實現(xiàn)。主頁面(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>局部緩存結(jié)束</div> <%=DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo)%> </body> </html>

主頁面的后臺請參看上篇,對主頁面采取了緩存策略,即在頁面中使用esi:include標(biāo)識。

被包含的頁面(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函數(shù)中加了兩個判斷,指的是:如果碰到test1.aspx就處理esi標(biāo)識,如果碰到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后,我們發(fā)現(xiàn),對于test2.aspx,由于我們使用了esi對其進行了包含,而test2.aspx又未進行緩存,所以在test1.aspx的緩存有效期內(nèi),隨著每一次刷新,test1.aspx的內(nèi)容沒有變動,但是所包含的test2.aspx區(qū)域,會實時刷新。

感謝各位的閱讀,以上就是“ASP.NET局部緩存怎么優(yōu)化”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對ASP.NET局部緩存怎么優(yōu)化這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI