SharePoint 加载项模型中的性能注意事项

在新 SharePoint 外接程序模型中确保 SharePoint 实现最佳性能的方法与使用完全信任代码不同。 在典型完全信任代码 (FTC) /场解决方案场景中,大部分代码操作发生在 SharePoint 服务器端对象模型代码中。

在 SharePoint 外接程序模型场景中,SharePoint 客户端对象模型 (CSOM) 和/或 SharePoint REST API 用来执行代码。

两个模型之间的主要区别是服务器端代码和客户端代码。 在 SharePoint 外接程序模型中,因为代码是通过客户端执行的,所以会产生额外的网络流量。 最大程度地减少 API 调用到 SharePoint 服务器的往返次数将提高 SharePoint 外接程序的性能,并降低 SharePoint 网站使用的资源量。

此外,在 SharePoint 外接程序模型中,因为代码是通过客户端执行的,所以在收到响应前可能会出现长时间的延迟。 为长时间运行的操作缓存数据(如用户配置文件 API)可以减少返回信息或收到某个过程已完成的确认信息所需的时间。

高级别准则

作为经验法则,我们希望提供以下高级别准则,以确保在新的 SharePoint 外接程序模型中实现 SharePoint 的最佳性能。

  • 最大程度地减少对 SharePoint 服务器的客户端 API 调用。
  • 使用服务器端和客户端缓存技术来存储信息。
  • 我们不建议在缓存中存储 clientID、clientSecret、用户名、密码、令牌或其他敏感的安全信息。

确保 SharePoint 实现最佳性能的方法。

有几个可确保 SharePoint 实现最佳性能的选项。

  • 使用客户端缓存
  • 使用服务器端缓存

使用客户端缓存

在此模式中,诸如 HTML5 LocalStorage 和 Cookie 等客户端缓存技术用于缓存数据。 在这些位置中存储的信息用于确定是否需要对 SharePoint 服务器进行 API 调用。

  • 此模式将存储客户端缓存中从 SharePoint API 调用返回的数据。
  • 此模式使用客户端代码 (JavaScript) 以评估存储在客户端缓存中的数据。
  • Cookie 中存储的数据被限制在 4095 字节以内。
    • Cookie 内置数据过期机制。
  • HTML5 LocalStorage 中存储的数据被限制在 5 MB 以内。
    • HTML5 LocalStorage 并没有内置数据过期机制。 但是,这种过期机制可以在 JavaScript 中快速而轻松地实现。

      setLocalStorageKeyExpiry有关示例,请参阅 Performance.LocalStorage (O365 PnP 示例) 中的App.js JavaScript 文件中的 和 isLocalStorageExpired 函数。

      在 LocalStorage 中设置过期密钥:

      function setLocalStorageKeyExpiry(key)
      {
          // Check for expiration config values
          var expiryConfig = localStorage.getItem(expiryConfigKey);
      
          // Check for existing expiration stamp
          var existingStamp = localStorage.getItem(key + expiryKeySuffix);
      
          // Override cached setting if a user has entered a value that is different than what is stored
          if (expiryConfig != null)
          {
              var currentTime = Math.floor((new Date().getTime()) / 1000);
              expiryConfig = parseInt(expiryConfig);
      
              var newStamp = Math.floor((currentTime + expiryConfig));
              localStorage.setItem(key + expiryKeySuffix, newStamp);
      
              // Log status to window
              cachingStatus += "\n" + "Setting expiration for the " + key + " key...";
              $('#status').val(cachingStatus);
          }
          else
        {
      
          }
      }
      

      查看 LocalStorage 中的过期密钥是否已过期:

      function isLocalStorageExpired(key, keyTimeStampName)
      {
        // Retrieve the example setting for expiration in seconds
        var expiryConfig = localStorage.getItem(expiryConfigKey);
      
        // Retrieve the example setting for expiration in seconds
        var expiryStamp = localStorage.getItem(keyTimeStampName);
      
        if (expiryStamp != null && expiryConfig != null) {
      
            // Retrieve the expiration stamp and compare against specified settings to see if it is expired
            var currentTime = Math.floor((new Date().getTime()) / 1000);
      
            if (currentTime - parseInt(expiryStamp) > parseInt(expiryConfig)) {
                cachingStatus += "\n" + "The " + key + " key time stamp has expired...";
                $('#status').val(cachingStatus);
                return true;
            }
            else
            {
                var estimatedSeconds = parseInt(expiryStamp) - currentTime;
                cachingStatus += "\n" + "The " + key + " time stamp expires in " + estimatedSeconds + " seconds...";
                $('#status').val(cachingStatus);
                return false;
            }
        }
        else
        {
            //default
            return true;
        }
      }
      

何时适合?

当你需要使用 SharePoint ECMA 客户端对象模型 API (sp.js),并评估客户端数据以确定是否需要执行 API 调用时。

入门

Performance.Caching(O365 PnP 示例)演示了如何在外接程序模型中实现 LocalStorage 和基于 cookie 的客户端缓存,并提供几个示例和文章的链接。

使用服务器端缓存

此模式中,服务器端缓存技术(如会话和服务器端 cookie 评估)用于访问缓存数据。 在这些位置中存储的信息用于确定是否需要对 SharePoint 服务器进行 API 调用。

  • 此模式将存储服务器端缓存中从 SharePoint API 调用返回的数据。

  • 此模式使用服务器端代码以评估存储在服务器端位置的数据。

    • 服务器端位置可能包括基于会话的数据、存储在 RAM 中的服务器端缓存,或基于其他第三方服务器的缓存技术。
  • 此模式使用服务器端代码,以评估存储在 cookie 中的数据。

  • Cookie 中存储的数据被限制在 4095 字节以内。

    • Cookie 内置数据过期机制。

    请参阅 OD4B.Configuration.Async(O365 PnP 示例)(#od4b.configuration.async(o365-pnp-示例)中 Customizer.aspx.cs 类(#customizer.aspx.cs-类) 中的 CookieCheckSkip 方法,以了解使用服务器端代码评估 cookie 的方法。

实现自己的“中间人”缓存层

有时,创建自己的自定义缓存层是有意义的。 一个很好的示例是当你需要从用户配置文件返回信息时。 用户配置文件 API 有时需要很长时间才能执行。 为了给最终用户提供快速的用户界面体验,你可以创建一个远程计时器作业,以查询用户配置文件服务,并在多种数据存储中存储信息。 然后,你可以创建服务,以允许你通过来自 SharePoint 外接程序的 JavaScript 调用来查询数据存储。

Azure 具有很多不同的存储机制,可用于存储信息,其中的很多存储机制执行速度很快,如 Table 存储和 Blob 存储。 Azure 还允许你创建 Web 应用,以托管服务并保护所有数据及将相同的 Azure Active Directory 用作 Office 365 SharePoint 租赁的所有服务,甚至保护启用了 DirSync 的本地 SharePoint 环境。

何时适合?

  • 当你需要使用 SharePoint Managed 代码客户端对象模型 API (Microsoft.SharePoint.Client.dll) 并评估服务器端数据或 cookie,以确定是否需要执行 API 调用时。
  • 当你有长时间的操作在运行时(如 Azure Web 作业),无论用户进行多少次启动操作的尝试,该操作在每个给定的时间范围仅启动一次。
    • 应用自定义的 OneDrive for Business 配置是该应用场景的一个很好的示例。

入门

Performance.Caching(O365 PnP 示例)介绍了如何实现 LocalStorage 和外接程序模型中基于 cookie 的客户端缓存,并提供了几个示例和文章的链接。

PnP 示例

适用于

  • Office 365 多租户 (MT)
  • Office 365 专用 (D)
  • SharePoint 2013 本地