2017-06-20 103 views
2

我正在構建一個網站,該網站將具有一項功能,如果您將鼠標懸停在某個對象上,則特殊div將填充有關於該對象的詳細信息的ajax。在.NET Core中緩存API響應

因爲客戶端是不是真的那麼重要,我只是說,有上觸發AJAX​​與https://api..../GetDetails/*Id* URL和功能將通過的EntityFramework獲取項目的詳細信息,並查看將某些元素的jQuery懸停事件像

@model Details 

<h1>@Model.Name</h1> 

(再次,簡化,因爲它不是重點)。

但隨着用戶數量的不斷增加,以及人們只需像瘋子一樣輕掃鼠標的事實,我認爲不緩存會造成流量問題。

是否有可能,如果是這樣,我怎麼可以緩存響應,這樣

https://api..../GetDetails/ABC總是返回同樣的事情沒有做後面和https://api..../GetDetails/DEF所有的數學不返回ABC,但它的緩存呢?

+0

剛剛發生在我身上,我在技術上可以在服務器上使用像HongFire這樣的調度程序, t將其創建充滿了對每個項目的HTML信息的文件夾和Web上的鏈接僅僅指的是文件,而不是實際的API調用.. – DethoRhyne

+0

我認爲,如果你使用jQuery .load方法將其緩存所以只有一個單一的網絡請求是每頁加載。我會用打開的瀏覽器開發工具對它進行測試,看看有多少網絡請求發送到您的端點。 – dbattaglia

+0

有會是一個很多,我敢肯定的通話..移動從一個側面對象到另一個(jQuery UI的可棄),它用於驗證的目的。我可以說出不少Ajax調用來獲得JSON數據+的我在這裏談論懸停的東西 – DethoRhyne

回答

2

您可以使用IMemoryCache(或任何其他緩存服務)或緩存標籤助手。

IMemoryCache

首先,註冊它:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMemoryCache(); 
} 

然後將其注入到你的控制器:

private IMemoryCache _cache; 

public HomeController(IMemoryCache memoryCache) 
{ 
    _cache = memoryCache; 
} 

和緩存模型:

public async Task<IActionResult> Get(string id) 
{ 
    if (!_cache.TryGetValue(id, out Details cachedDetails)) 
    { 
     cachedDetails = await GetDetailsAsync(id); 

     var cacheEntryOptions = new MemoryCacheEntryOptions() 
      .SetSlidingExpiration(TimeSpan.FromHours(1)); 

     _cache.Set(id, cachedDetails, cacheEntryOptions); 
    } 

    return View(cachedDetails); 
} 

高速緩存標記輔助

在你看來,你可以使用這樣的事情:

@model Details 

<cache vary-by-route="id"> 
    <h1>@Model.Name</h1> 
</cache> 
3

在ASP.NET核心,你可以使用響應緩存。它會讓我們將緩存相關的標題添加到響應中。這些頭文件決定了客戶端,代理或中間件如何緩存響應。 請參閱文檔ASP.NET Core Response Caching

這是一個廣泛的功能,可用於根據請求標頭值確定緩存位置,持續時間和無效緩存。您甚至可以爲不同的場景創建緩存配置文件。 一些樣品是如下

1.Cache由持續時間

[ResponseCache(Duration = 60)] 
public IActionResult Contact() 
{ 
    ViewData["Message"] = "Your contact page."; 

    return View(); 
} 

2.設置緩存位置

[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Client)] 
public IActionResult Contact() 
{ 
    ViewData["Message"] = "Your contact page."; 

    return View(); 
} 

3。由請求報頭改變響應緩存

[ResponseCache(VaryByHeader = "User-Agent", Duration = 30)] 
public IActionResult Contact() 
{ 
    ViewData["Message"] = "Your contact page."; 

    return View(); 
} 
  • 在啓動

    services.AddMvc(options => 
    { 
        options.CacheProfiles.Add("Default", 
         new CacheProfile() 
         { 
          Duration = 60 
         }); 
        options.CacheProfiles.Add("Never", 
         new CacheProfile() 
         { 
          Location = ResponseCacheLocation.None, 
          NoStore = true 
         }); 
    }); 
    
  • 使用緩存配置文件創建緩存輪廓根據需要

    [ResponseCache(CacheProfileName = "Default")] 
    public IActionResult Index() 
    { 
        return View(); 
    }