代码之家  ›  专栏  ›  技术社区  ›  Jen

加载Kentico 10 web节点的最佳方法,包括缓存和权限检查

  •  1
  • Jen  · 技术社区  · 6 年前

    我有一个自定义产品类型,它显示在自定义列表web部件中。出于性能原因,我试图缓存这些项目,但检查用户权限也很重要,因为并非所有用户都能看到所有产品。

    private static IList<TreeNode> GetUniqueProducts(string clientId, string path)
    {
          var pages = CacheHelper.Cache(cs => GetProducts(cs, path), new CacheSettings(10, "cus|" + clientId));
          return GetUniqueProductNamesItems(pages);
    }
    
    private static IList<TreeNode> GetProducts(CacheSettings cacheSettings, string rootPath)
    {
        var pages = DocumentHelper.GetDocuments().Types("CUS.Product")
                    .Path(rootPath, PathTypeEnum.Children)
                    .Published().CheckPermissions().ToList();
    
        if (cacheSettings.Cached)
        {
              cacheSettings.CacheDependency = CacheHelper.GetCacheDependency("nodes|custom|cus.product|all");
        }
    
        return pages;
    }
    

    然而,我意识到这是缓存第一个用户的产品列表。实际上,我想在缓存中存储产品的完整列表,但在显示之前检查权限。

    检查权限的唯一方法似乎是如上所述的DocumentQuery的一部分,但我不知道如何将其应用于缓存的产品列表或单个节点。

    那么,有没有一个好的方法来实现我想要的?无需遍历每个节点并单独检查用户是否有权访问该节点?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Peter Mogilnitski    6 年前

    您的代码中缺少缓存部分,我不确定您的缓存依赖关系。

        var pages = CacheHelper.Cache(cs  =>
        {
            var result = CMS.DocumentEngine.DocumentHelper.GetDocuments().Types("CUS.Product").Path(rooPath, CMS.DocumentEngine.PathTypeEnum.Children).Published().ToList();
            if (cs.Cached) { cs.CacheDependency = CacheHelper.GetCacheDependency("cus.product|all"); }
            return result;
        },
        new CacheSettings(CacheHelper.CacheMinutes(CurrentSite.SiteName), "custom_products"));
    

    如果您检查用户的读取权限,则意味着您需要对每个用户进行缓存。然后,应按用户进行缓存,即cachename应为“custom\u products”+UserID。ToString()或类似的内容。