多域名下Mvc的Http缓存冲突的问题
生活随笔
收集整理的這篇文章主要介紹了
多域名下Mvc的Http缓存冲突的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在做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");后來有個用戶網站使用多站點的時候,每個站點綁定了一個域名,而且都啟用了開啟了緩存,結果每個域名打開的首頁都是一樣的,都是第一個服務器緩存的首頁,后來研究了HttpCachePolicyBase這個類,其中有一個屬性
public virtual HttpCacheVaryByHeaders VaryByHeaders { get; }看名稱就知道是根據頭信息緩存,但是發現沒有set訪問器,也沒有辦法直接賦值,好吧,再次跟蹤HttpCacheVaryByHeaders
代碼如下
using System.Reflection;namespace System.Web {//// 摘要:// 提供一種設置 System.Web.HttpCachePolicy.VaryByHeaders 屬性的類型安全的方法。[DefaultMember("Item")]public sealed class HttpCacheVaryByHeaders{//// 摘要:// 初始化 System.Web.HttpCacheVaryByHeaders 類的新實例。public HttpCacheVaryByHeaders();//// 摘要:// 獲取或設置一個自定義標頭字段,ASP.NET 輸出緩存將隨該字段改變緩存的響應,并將其追加到傳出的 Vary HTTP 標頭。//// 參數:// header:// 自定義標頭的名稱。//// 返回結果:// 當 ASP.NET 輸出緩存隨指定的自定義字段而變化時,則為 true ;否則為 false。默認值為 false。//// 異常:// T:System.ArgumentNullException:// header 為 null。public bool this[string header] { get; set; }//// 摘要:// 獲取或設置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept HTTP 標頭而改變緩存的響應并將該標頭追加到傳出的 Vary HTTP 標頭。//// 返回結果:// 當 ASP.NET 輸出緩存隨 Accept 標頭而改變時,則為 true;否則為 false。默認值為 false。public bool AcceptTypes { get; set; }//// 摘要:// 獲取或設置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept-Language 標頭改變緩存的響應并將該標頭追加到傳出的 Vary HTTP// 標頭。//// 返回結果:// 當 ASP.NET 輸出緩存隨 Accept-Language 標頭而變化并將該標頭添加到被發送到客戶端的 Vary HTTP 標頭時,則為 true;否則為// false。默認值為 false。public bool UserLanguage { get; set; }//// 摘要:// 獲取或設置一個值,該值指示 ASP.NET 輸出緩存是否隨 User-Agent 標頭改變緩存的響應并將該標頭追加到傳出的 Vary HTTP 標頭。//// 返回結果:// 當 ASP.NET 輸出緩存隨 User-Agent 標頭而變化并將該標頭添加到被發送到客戶端的 Vary HTTP 標頭時,則為 true;否則為 false。默認值為// false。public bool UserAgent { get; set; }//// 摘要:// 獲取或設置一個值,該值指示 ASP.NET 輸出緩存是否隨 Accept-Charset 標頭改變緩存的響應并將該標頭追加到傳出的 Vary HTTP 標頭。//// 返回結果:// 當 ASP.NET 輸出緩存隨 Accept-Charset 標頭而變化并將該標頭添加到被發送到客戶端的 Vary HTTP 標頭時,則為 true;否則為// false。默認值為 false。public bool UserCharSet { get; set; }//// 摘要:// 導致 ASP.NET 隨所有標頭值而變化,并將 Vary HTTP 標頭設置為值 *(星號)。所有其他 Vary 標頭信息將被丟棄。public void VaryByUnspecifiedParameters();} }上面代碼可以看到,發現有一個public bool this[string header] { get; set; }屬性可以設置,那就問題解決,緩存聲明時添加一個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");
?看紅色部分,設置一個host來區分就可以了,完美解決多個域名緩存沖突的問題。
?
轉載于:https://www.cnblogs.com/huaguo/p/10319464.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的多域名下Mvc的Http缓存冲突的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虎牙直播张波:掘金Nginx日志
- 下一篇: 使用SQL语句创建数据库2——创建多个数