在引入外部二进制大型对象 (BLOB) 存储提供程序(EBS 提供程序)之前,BLOB 存储语义会将与 SharePoint 文件关联的二进制数据流传送到与站点的结构化数据共享的 Microsoft SQL Server 内容数据库中。在这种情况下,如果对 SharePoint 文件调用 Save 命令,则 Save 路径中的分析器就会识别出 Save 命令,并提升文件流中的一部分元数据。然后将元数据以及与该文件关联的 BLOB 存储到 SQL Server 内容数据库中。
但是,在安装、配置和启用 EBS 提供程序后,语义会发生很大变化(见图 1)。现在,不是由 Web 应用程序,而是由中间层存储访问堆栈传送 BLOB 数据流,并使用 EBS 提供程序将 BLOB 数据存储到外部 BLOB 存储中,然后返回允许其根据需要检索 BLOB 的元数据。重要的是,SharePoint 对象模型与 EBS 提供程序的语义以及外部 BLOB 存储的存在与否完全无关。这种分离可以确保存储实现完全不了解现有应用程序和服务。只有存储访问堆栈才知道外部 BLOB 存储的语义及其是否存在。
图 1. 外部 BLOB 存储体系结构
EBS 提供程序是提供程序接口的自定义实现,它是非托管 ISPExternalBinaryProvider,同时可以作为 COM 组件集成到存储访问堆栈中。
提供程序接口为您提供了两种方法:StoreBinary 和 RetrieveBinary。存储访问堆栈能够识别 Save 和 Open 命令,当这些命令与 BLOB 文件关联时,它会分别调用 StoreBinary 和 RetrieveBinary 方法。
可以通过使用 Save 命令来将 BLOB 数据存储到外部数据存储中。图 2 从功能上说明了如何将前端 Web 应用程序中的 Save 命令从存储访问堆栈传送到 EBS 提供程序并存储到外部。最后,有关其位置的记录会作为元数据保留在内容数据库中。
图 2. 使用 Save 命令的 BLOB 存储
在对前端 Web 应用程序调用 Save 命令时,该应用程序的中间层逻辑将提供业务逻辑验证,其中包括防病毒检查、属性升级、版权管理和其他预处理任务。之后,存储访问堆栈会识别出 Save 命令是针对 BLOB 文件的。提供程序接口会将请求传递给 EBS 提供程序,而 EBS 提供程序会将二进制流保存到外部 BLOB 存储中。
EBS 提供程序然后将 BLOB ID (BlobId) 返回给该接口,该接口再将此 ID 传递给存储访问堆栈。访问堆栈再将 ID 和 BLOB 元数据保存到内容数据库中。
EBS 提供程序负责为它放在外部 BLOB 存储中的 BLOB 文件返回一个唯一标识符([输出] ppbBinaryId)。
从外部 BLOB 存储检索 BLOB 数据与 Save 操作相反。当 EBS 提供程序识别出要对与 BLOB 关联的文件执行的 Open 命令后,它会对提供程序接口调用某些方法以从外部 BLOB 存储检索该文件。图 3 从功能上说明了存储访问堆栈如何使用前端 Web 应用程序中的 Open 命令来从内容数据库中检索 BLOB ID,然后使用该 ID 从外部 BLOB 存储中检索二进制流。
图 3. 使用 Open 命令的 BLOB 检索
存储访问堆栈通过向内容数据库发送 Transact-SQL 查询来检索元数据和 BlobId;然后,再将返回值 (BlobId) 传递给 EBS 提供程序,以便后者能够对 ISPExternalBinaryProvider 接口使用 RetrieveBinary 方法从外部 BLOB 存储中获取相应的二进制文件。该方法会将一个 ILockBytes 接口返回给存储访问堆栈。
与 StoreBinary 方法一样,EBS 提供程序也负责记录检索事件。Windows SharePoint Server 会记录意外的 HRESULT 返回值,但从记录结果看,返回值好像只包括 S_OK 或 E_FAIL。
存储访问堆栈会将 EBS 提供程序错误映射到已知错误代码。