【问题标题】:Caching API responses in .NET Core在 .NET Core 中缓存 API 响应
【发布时间】:2017-11-23 10:54:33
【问题描述】:

我正在构建一个网站,该网站将具有一个功能,如果您将鼠标悬停在一个对象上,一个特殊的 div 将被 ajax 填充并包含该对象的详细信息。

由于客户端并不是那么重要,我只想说某些元素上的 jquery 悬停事件会触发带有 https://api..../GetDetails/*Id* url 的 ajax .load(),并且该函数将通过 EntityFramework 和视图将类似于

@model Details

<h1>@Model.Name</h1> 

(再次简化,因为这不是重点)。

但是随着用户群的增长,以及一个人可以像疯子一样随意滑动鼠标这一事实,我认为不缓存它会造成流量问题。

有没有可能,如果有,我如何缓存响应以便

https://api..../GetDetails/ABC 总是返回相同的东西而不做所有背后的数学运算,https://api..../GetDetails/DEF 不返回 ABC 但它也被缓存了?

【问题讨论】:

  • 我突然想到,从技术上讲,我可以在服务器上使用 HongFire 之类的调度程序,以便它为每个项目创建一个包含 html 信息的文件夹,并且网络上的链接只是引用该文件实际的 api 调用..
  • 我认为如果您使用 jQuery .load 方法,它会缓存它,因此每次页面加载只会发出一个网络请求。我会用打开的浏览器开发工具来测试它,看看有多少网络请求被发送到你的端点。
  • 我确信会有很多调用.. 将对象从一侧移动到另一侧(jquery ui droppable)以进行验证.. 我可以说出很多 ajax调用以获取 json 数据 + 我在悬停时讨论的内容

标签: .net ajax caching asp.net-core-mvc .net-core


【解决方案1】:

您可以使用 IMemoryCache(或任何其他缓存服务)或 Cache Tag Helper。

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>

【讨论】:

    【解决方案2】:

    在 ASP.NET Core 中,您可以使用响应缓存。它将让我们将缓存相关的标头添加到响应中。这些标头确定客户端、代理或中间件如何缓存响应。 参考文档ASP.NET Core Response Caching

    这是一项广泛的功能,可用于根据请求标头值确定缓存位置、持续时间和无效缓存。您甚至可以为不同的场景创建缓存配置文件。 部分示例如下

    1.按时长缓存

    [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();
    }
    
    1. 在启动中创建缓存配置文件

      services.AddMvc(options =>
      {
          options.CacheProfiles.Add("Default",
              new CacheProfile()
              {
                  Duration = 60
              });
          options.CacheProfiles.Add("Never",
              new CacheProfile()
              {
                  Location = ResponseCacheLocation.None,
                  NoStore = true
              });
      });
      
    2. 根据需要使用缓存配置文件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-08
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      相关资源
      最近更新 更多