一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - ASP.NET教程 - ASP.NET Core中的Http緩存使用

ASP.NET Core中的Http緩存使用

2020-06-27 16:04.NET騷操作 ASP.NET教程

這篇文章主要介紹了ASP.NET Core中的Http緩存使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Http響應(yīng)緩存可減少客戶端或代理對web服務(wù)器發(fā)出的請求數(shù)。響應(yīng)緩存還減少了web服務(wù)器生成響應(yīng)所需的工作量。響應(yīng)緩存由Http請求中的header控制。

ASP.NET Core對其都有相應(yīng)的實現(xiàn),并不需要了解里面的工作細(xì)節(jié),即可對其進(jìn)行良好的控制。

了解Http緩存

Http協(xié)議中定義了許多緩存,但總體可以分為強(qiáng)緩存和協(xié)商緩存兩類。

ASP.NET Core中的Http緩存使用

強(qiáng)緩存

強(qiáng)緩存是指緩存命中時,客戶端不會向服務(wù)器發(fā)請求,瀏覽器F12能看到響應(yīng)狀態(tài)碼為200sizefrom cache,它的實現(xiàn)有以下幾種方式:

Expires - 絕對時間

示例:Expires:Thu,31 Dec 2037 23:59:59 GMT,就表示緩存有效期至2037年12月31日,在這之前瀏覽器都不會向服務(wù)器發(fā)請求了(除非按F5/Ctrl+F5刷新)。

Cache-Control - 相對時間/更多控制

絕對時間是一個絕對時間,因為計算時不方便;而且服務(wù)端是依據(jù)服務(wù)器的時間來返回,但客戶端卻需要依據(jù)客戶的時間來判斷,因此也容易失去控制。

Cache-Control有以下選項(可以多選):

  1. max-age: 指定一個時間長度,在這個時間段內(nèi)緩存是有效的,單位是秒(s)。例如設(shè)置Cache-Control:max-age=31536000,也就是說緩存有效期為31536000/24/60/60=365天。
  2. s-maxage: 同max-age,覆蓋max-age、Expires,但僅適用于共享緩存,在私有緩存中被忽略。
  3. public: 表明響應(yīng)可以被任何對象(發(fā)送請求的客戶端、代理服務(wù)器等等)緩存。
  4. private: 表明響應(yīng)只能被單個用戶(可能是操作系統(tǒng)用戶、瀏覽器用戶)緩存,是非共享的,不能被代理服務(wù)器緩存。
  5. no-cache: 強(qiáng)制所有緩存了該響應(yīng)的用戶,在使用已緩存的數(shù)據(jù)前,發(fā)送帶驗證器的請求到服務(wù)器。(不是字面意思上的不緩存)
  6. no-store: 禁止緩存,每次請求都要向服務(wù)器重新獲取數(shù)據(jù)。
  7. must-revalidate: 指定如果頁面是過期的,則去服務(wù)器進(jìn)行獲取。(意思是瀏覽器在某些情況下,緩存失效后仍可使用老緩存,加了這個頭,失效后就必須驗證,并不是字面上有沒有過期都驗證)

其中最有意思的要數(shù)no-cachemust-revalidate了,因為它們的表現(xiàn)都不是字面意義。

no-cache并不是字面上的不緩存,而是會一直服務(wù)端驗證(真實意義很像字面上的must-revalidate)。

must-revalidate是只是為了給瀏覽器強(qiáng)調(diào),緩存過期后,千萬要遵守約定重新驗證。

協(xié)商緩存

協(xié)商緩存是指緩存命中時,服務(wù)器返回Http狀態(tài)碼為304但無內(nèi)容(Body),沒命中時返回200有內(nèi)容。

在要精細(xì)控制時,協(xié)商緩存比強(qiáng)緩存更有用,它有Last-ModifiedETag兩種。

Last-Modified/If-Modify-Since(對比修改時間)

示例:

服務(wù)器:Last-Modified: Sat, 27 Jun 2015 16:48:38 GMT
客戶端:If-Modified-Since: Sat, 27 Jun 2015 16:48:38 GMT

ETag/If-None-Match(對比校驗碼)

服務(wù)器:ETag: W/"0a0b8e05663d11:0"
客戶端:If-None-Match: W/"0a0b8e05663d11:0"

清緩存要點

  1. F5刷新時,強(qiáng)緩存失效
  2. Ctrl+F5刷新時 強(qiáng)緩存和協(xié)商緩存都失效

ASP.NET Core的Http緩存

ASP.NET Core中提供了ResponseCacheAttribute來實現(xiàn)緩存,它的定義如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class ResponseCacheAttribute : Attribute, IFilterFactory, IFilterMetadata, IOrderedFilter
{
  public ResponseCacheAttribute();
  public string CacheProfileName { get; set; }
  public int Duration { get; set; }
  public bool IsReusable { get; }
  public ResponseCacheLocation Location { get; set; }
  public bool NoStore { get; set; }
 
  public int Order { get; set; }
  public string VaryByHeader { get; set; }
  public string[] VaryByQueryKeys { get; set; }
}

其中,ResponseCacheLocation定義了緩存的位置,是重點:

?
1
2
3
4
5
6
7
8
9
10
//   Determines the value for the "Cache-control" header in the response.
public enum ResponseCacheLocation
{
  //   Cached in both proxies and client. Sets "Cache-control" header to "public".
  Any = 0,
  //   Cached only in the client. Sets "Cache-control" header to "private".
  Client = 1,
  //   "Cache-control" and "Pragma" headers are set to "no-cache".
  None = 2
}

注意看源文件中的注釋,Any表示Cache-Control: publicClient表示Cache-Control: privateNone表示Cache-Control: no-cache

注意ResponseCacheLocation并沒有定義將緩存放到服務(wù)器的選項。

其中Duration表示緩存時間,單位為秒,它將翻譯為max-age

另外可以通過VaryByHeaderVaryByQueryKeys來配置緩存要不要通過headerquery string來變化,其中VaryByHeader是通過Http協(xié)議中的Vary頭來實現(xiàn)的,VaryByQueryKeys必須通過Middleware來實現(xiàn)。

不要誤會,所有ResponseCacheAttribute的屬性配置都不會在服務(wù)端緩存你的響應(yīng)數(shù)據(jù)(雖然你可能有這種錯覺),它和輸出緩存不同,它沒有狀態(tài),只用來做客戶端強(qiáng)緩存。

如果不想緩存,則設(shè)置NoStore = true,它會設(shè)置cache-control: no-store,我們知道no-store的真實意思是不緩存。一般還會同時設(shè)置Location = ResponseCacheLocation.None,它會設(shè)置cache-control: no-cache(真實意思是表示一定會驗證)。

注意單獨(dú)設(shè)置Location = ResponseCacheLocation.None而不設(shè)置NoStore并不會有任何效果。

示例1

這是一個很典型的使用示例:

?
1
2
3
4
5
6
7
8
public class HomeController : Controller
{
  [ResponseCache(Duration = 3600, Location = ResponseCacheLocation.Client)]
  public IActionResult Data()
  {
    return Json(DateTime.Now);
  }
}

我定義了3600秒的緩存,并且cache-control應(yīng)該為private,生成的Http緩存頭可以通過如下C#代碼來驗證:

?
1
2
3
4
using var http = new HttpClient();
var resp1 = await http.GetAsync("https://localhost:55555/home/data");
Console.WriteLine(resp1.Headers.CacheControl.ToString());
Console.WriteLine(await resp1.Content.ReadAsStringAsync());

輸入結(jié)果如下:

max-age=3600, private
"2020-03-07T21:35:01.5843686+08:00"

另外,ResponseCacheAttribute也可以定義在Controller級別上,表示整個Controller都受到緩存的影響。

CacheProfileName示例

另外,如果需要共用緩存配置,可以使用CacheProfileName,將緩存提前定義好,之后直接傳入這個定義名即可使用:

?
1
2
3
4
5
6
7
8
9
10
11
.ConfigureServices(s =>
{
  s.AddControllers(o =>
  {
    o.CacheProfiles.Add("3500", new CacheProfile
    {
      Duration = 3500,
      Location = ResponseCacheLocation.Client,
    });
  });
});

這樣我就定義了一個名為3500的緩存,稍后在Controller中我只需傳入CacheProfileName = 3500即可:

?
1
2
3
4
5
6
7
8
public class HomeController : Controller
{
  [ResponseCache(CacheProfileName = "3500")]
  public IActionResult Data()
  {
    return Json(DateTime.Now);
  }
}

總結(jié)

Http緩存分為強(qiáng)緩存和協(xié)商緩存,ASP.NET Core提供了便利的ResponseCacheAttribute實現(xiàn)了強(qiáng)緩存,還能通過Profile來批量配置多個緩存點。

ASP.NET MVC并沒有提供協(xié)商緩存實現(xiàn),因為這些多半和業(yè)務(wù)邏輯相關(guān),需要自己寫代碼。靜態(tài)文件是特例,Microsoft.AspNetCore.StaticFiles中提供有,因為靜態(tài)文件的邏輯很清晰。

ASP.NET中的OutputCacheAttributeASP.NET Core中不復(fù)存在,取而代之的是app/services.AddResponseCaching(),這些和Http協(xié)議不相關(guān)。

有機(jī)會我會具體聊聊這些緩存。

到此這篇關(guān)于ASP.NET Core中的Http緩存使用的文章就介紹到這了,更多相關(guān)ASP.NET Core Http緩存內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/sdflysha/p/20200301-http-cache-in-aspnet-core.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清免费看 | mm131亚洲精品久久 | 天美传媒tm0087 | 亚洲国产精品无圣光一区二区 | 青青草国产免费久久久91 | 国产v视频 | 久久爽狠狠添AV激情五月 | 龟甲情感超市全文阅读 小说 | 精品淑女少妇AV久久免费 | 黄动漫车车好快的车车a | 久久这里只有精品视频9 | 日本三级做a全过程在线观看 | 日韩欧美不卡片 | 精品国产麻豆AV无码 | 日本小视频网站 | 亚洲 日本 中文字幕 制服 | 日本伊人色综合网 | 朝鲜美女免费一级毛片 | 国产成人在线免费视频 | 婷婷丁香色综合狠狠色 | 大胸孕妇孕交pregnantsex 大象视频污 | 韩日视频在线观看 | 色婷婷天天综合在线 | 九九精品视频一区二区三区 | 柔术一级毛片 | 91人成网站色www | 免费大片 | 国产香蕉一区二区在线网站 | 欧美日韩在线观看一区二区 | 成人久久18网站 | 国内精品久久久久久久久 | 国产精品美女福利视频免费专区 | 国产麻豆精品入口在线观看 | 国产精品永久免费视频观看 | 性一交一无一伦一精一品 | 女高h| 美女被吸乳得到大胸 | 成人综合网址 | 特级老女人淫片高清视频 | 免费激情小视频 | 青丝视频免费版在线看 |