2017-06-20 159 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(); 
    }