多域名下Mvc的Http缓存冲突的问题
生活随笔
收集整理的這篇文章主要介紹了
多域名下Mvc的Http缓存冲突的问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近在做PageAdmin cms時候,欄目頁用了http緩存,iis站點綁定了多個域名,后臺也是每個站點綁定多個域名,最開始的http緩存寫法如下:
HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);//Duration為緩存過期時間,單位秒 cache.SetCacheability(HttpCacheability.Public);cache.SetExpires(DateTime.Now.Add(cacheDuration));cache.SetMaxAge(cacheDuration); //cacheDurationcache.AppendCacheExtension("must-revalidate, proxy-revalidate");后來有個用戶網(wǎng)站使用多站點的時候,每個站點綁定了一個域名,而且都啟用了開啟了緩存,結(jié)果每個域名打開的首頁都是一樣的,都是第一個服務(wù)器緩存的首頁,后來研究了HttpCachePolicyBase這個類,其中有一個屬性
public virtual HttpCacheVaryByHeaders VaryByHeaders { get; }看名稱就知道是根據(jù)頭信息緩存,但是發(fā)現(xiàn)沒有set訪問器,也沒有辦法直接賦值,好吧,再次跟蹤HttpCacheVaryByHeaders
代碼如下
using System.Reflection;namespace System.Web {//// 摘要:// 提供一種設(shè)置 System.Web.HttpCachePolicy.VaryByHeaders 屬性的類型安全的方法。[DefaultMember("Item")]public sealed class HttpCacheVaryByHeaders{//// 摘要:// 初始化 System.Web.HttpCacheVaryByHeaders 類的新實例。public HttpCacheVaryByHeaders();//// 摘要:// 獲取或設(shè)置一個自定義標(biāo)頭字段,ASP.NET 輸出緩存將隨該字段改變緩存的響應(yīng),并將其追加到傳出的 Vary HTTP 標(biāo)頭。//// 參數(shù):// header:// 自定義標(biāo)頭的名稱。//// 返回結(jié)果:// 當(dāng) ASP.NET 輸出緩存隨指定的自定義字段而變化時,則為 true ;否則為 false。默認值為 false。//// 異常:// T:System.ArgumentNullException:// header 為 null。public bool this[string header] { get; set; }//// 摘要:// 獲取或設(shè)置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept HTTP 標(biāo)頭而改變緩存的響應(yīng)并將該標(biāo)頭追加到傳出的 Vary HTTP 標(biāo)頭。//// 返回結(jié)果:// 當(dāng) ASP.NET 輸出緩存隨 Accept 標(biāo)頭而改變時,則為 true;否則為 false。默認值為 false。public bool AcceptTypes { get; set; }//// 摘要:// 獲取或設(shè)置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept-Language 標(biāo)頭改變緩存的響應(yīng)并將該標(biāo)頭追加到傳出的 Vary HTTP// 標(biāo)頭。//// 返回結(jié)果:// 當(dāng) ASP.NET 輸出緩存隨 Accept-Language 標(biāo)頭而變化并將該標(biāo)頭添加到被發(fā)送到客戶端的 Vary HTTP 標(biāo)頭時,則為 true;否則為// false。默認值為 false。public bool UserLanguage { get; set; }//// 摘要:// 獲取或設(shè)置一個值,該值指示 ASP.NET 輸出緩存是否隨 User-Agent 標(biāo)頭改變緩存的響應(yīng)并將該標(biāo)頭追加到傳出的 Vary HTTP 標(biāo)頭。//// 返回結(jié)果:// 當(dāng) ASP.NET 輸出緩存隨 User-Agent 標(biāo)頭而變化并將該標(biāo)頭添加到被發(fā)送到客戶端的 Vary HTTP 標(biāo)頭時,則為 true;否則為 false。默認值為// false。public bool UserAgent { get; set; }//// 摘要:// 獲取或設(shè)置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept-Charset 標(biāo)頭改變緩存的響應(yīng)并將該標(biāo)頭追加到傳出的 Vary HTTP 標(biāo)頭。//// 返回結(jié)果:// 當(dāng) ASP.NET 輸出緩存隨 Accept-Charset 標(biāo)頭而變化并將該標(biāo)頭添加到被發(fā)送到客戶端的 Vary HTTP 標(biāo)頭時,則為 true;否則為// false。默認值為 false。public bool UserCharSet { get; set; }//// 摘要:// 導(dǎo)致 ASP.NET 隨所有標(biāo)頭值而變化,并將 Vary HTTP 標(biāo)頭設(shè)置為值 *(星號)。所有其他 Vary 標(biāo)頭信息將被丟棄。public void VaryByUnspecifiedParameters();} }上面代碼可以看到,發(fā)現(xiàn)有一個public bool this[string header] { get; set; }屬性可以設(shè)置,那就問題解決,緩存聲明時添加一個host請求頭就可以了,代碼如下:
?
???????? HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;??????????? cache.VaryByHeaders["host"]=true;//host不同時緩存不同
??????????? TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);//單位秒
??????????? cache.SetCacheability(HttpCacheability.Public);
??????????? cache.SetExpires(DateTime.Now.Add(cacheDuration));
??????????? cache.SetMaxAge(cacheDuration);
??????????? cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
?看紅色部分,設(shè)置一個host來區(qū)分就可以了,完美解決多個域名緩存沖突的問題。
?
轉(zhuǎn)載于:https://www.cnblogs.com/huaguo/p/10319464.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的多域名下Mvc的Http缓存冲突的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虎牙直播张波:掘金Nginx日志
- 下一篇: [转]Google的C++代码规范