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 的客户端缓存,并提供了几个示例和文章的链接。
相关链接
- 指南文章中 https://aka.ms/OfficeDevPnPGuidance
- MSDN 中的引用位于 https://aka.ms/OfficeDevPnPMSDN
- 视频中的 https://aka.ms/OfficeDevPnPVideos
PnP 示例
适用于
- Office 365 多租户 (MT)
- Office 365 专用 (D)
- SharePoint 2013 本地