使用 SharePoint Server 2010 中的 Business Connectivity Services 访问外部系统中的 BLOB 数据

**摘要:**了解如何使用 Microsoft SharePoint Server 2010 中的 Microsoft Business Connectivity Services (BCS) 在 SharePoint 用户界面和搜索中访问并显示 BLOB 数据。

上次修改时间: 2015年3月9日

适用范围: Business Connectivity Services | Open XML | SharePoint Designer 2010 | SharePoint Foundation 2010 | SharePoint Online | SharePoint Server 2010 | Visual Studio

本文内容
概述
设置服务器环境
设置 Business Connectivity Services
创建元数据模型
导入和配置模型
使用 Business Connectivity Services Web 部件
搜索 BLOB
结论
其他资源

**供稿人:**Tajeshwar Singh(访问他的博客(该链接可能指向英文页面)),SharePoint 方面的 MCM,Microsoft Services

目录

  • 概述

  • 设置服务器环境

  • 设置 Business Connectivity Services

  • 创建元数据模型

  • 导入和配置模型

  • 使用 Business Connectivity Services Web 部件

  • 搜索 BLOB

  • 结论

  • 其他资源

单击以获取代码  下载代码:使用 BCS (Adventureworks.bdcm) 从外部系统访问 BLOB 数据(该链接可能指向英文页面)

概述

Microsoft Business Connectivity Services (BCS) 是 Microsoft Office SharePoint Server 2007 业务数据目录功能的新版本。增添了许多新的功能以帮助从外部系统检索二进制大型对象数据(通常称为 BLOB 数据),并使这些数据可用于 Microsoft SharePoint Server 2010。本文介绍了以下内容:

  • Business Connectivity Services 中引入的 StreamAccessor 构造型所提供的功能。

  • 如何使用 StreamAccessor 从外部系统检索文件附件以进行查看和编制索引。

  • 如何编写使用 BLOB 数据所需的 BDC 模型。

  • BLOB 数据的内置 Web 部件行为,以及如何通过 SharePoint Server 搜索对 BLOB 字段编制索引。

在本文的方案中,将承载于 Microsoft SQL Server 2008 中的 AdventureWorks 数据库用作包含二进制数据的外部系统。通过 StreamAccessorMethodInstance 创建 BDC 元数据模型以从 SQL Server 中作为外部内容类型检索 varbinary 类型的 BLOB 字段。将 BLOB 字段作为可在块区中读取的类型进行建模,以帮助 Business Connectivity Services 在块区中读取流,而不在内存中加载完整内容。这可以防止出现内存不足的情况。Microsoft .NET Framework 中的 System.IO.Stream 就是此类型的一个示例。外部数据网格 Web 部件配置为显示带有下载 BLOB 的链接的外部项目。最后,配置搜索对 BLOB 进行爬网并在 SharePoint Server 搜索用户界面 (UI) 中显示结果。

设置服务器环境

以下为运行此方案的要求。

软件要求

确保在您的服务器环境中安装以下软件:

  • Microsoft SQL Server 2008 x64

  • 具有企业版客户端访问许可证的 Microsoft SharePoint Server 2010

创建 AdventureWorks 数据库

此方案使用 AdventureWorks 示例数据库来表示包含 BLOB 数据的外部系统。若要从 Codeplex 下载 AdventureWorks 示例数据库的 x64 版本,请参阅 SQL Server 2008 SR4(该链接可能指向英文页面)

运行安装程序以创建数据库。[Production].[Document] 表用于对包含 BLOB 字段的外部内容类型进行建模。"文档"列包含在表中存储为 varbinary 数据类型的 Microsoft Word 文档。

设置 Business Connectivity Services

此方案的第一步是在 SharePoint 环境中设置 Business Connectivity Services 基础结构。此步骤包括设置 Business Connectivity Services 服务应用程序、承载 Business Connectivity Services Web 部件的网站以及外部内容类型的配置文件页。

设置基础结构

  1. 确认 Business Data Connectivity (BDC) Service 正在运行。创建 BDC 服务应用程序。

  2. 创建 Web 应用程序 http://bcs.contoso.com,然后在首要(根)网站上创建网站集。

  3. 创建 URL 为 http://bcs.contoso.com/profile 的子网站。它将用于承载外部内容类型的配置文件页。

  4. 授予用于访问外部内容类型的帐户对 AdventureWorks 数据库和 Production.Document 表的读取权限。在此方案中,您将 Passthrough 用作元数据模型中的身份验证机制。因此,要连接到 SharePoint 的用户的标识用来针对 SQL Server 外部系统进行身份验证。

    如果您的部署在不同于 SharePoint 前端 Web 服务器的服务器上安装了外部系统 (SQL Server),则配置 Kerberos 协议以传递最终用户凭据,或使用 Secure Store Service 执行到外部系统的单一登录。

创建元数据模型

Microsoft SharePoint Designer 2010 提供创建外部内容类型并保存或将它们导出到元数据模型文件的功能。您必须手动对 StreamAccessor 构造型进行建模,因为其无法通过 SharePoint Designer 进行建模。为简化工作并准备基本元数据,建议您使用 SharePoint Designer 创建支持创建读取更新删除 (CRUD) 操作的初始元数据模型。然后您可以在文本编辑器(例如记事本)中执行其他编辑,或使用任何 XML 编辑器来添加 StreamAccessor 和 SharePoint Designer 中不支持的任何其他方法构造型。

在此方案中,您可以使用 SharePoint Designer 创建初始模型,然后通过导出模型并在记事本或其他 XML 编辑器中执行编辑来手动添加 StreamAccessor 构造型。

对于此方案,需要以下三种方法构造型:

  • ReadItem,用于检索特定外部项目(已给定外部项目的 ID)的字段。可以通过 SharePoint Designer 对其进行建模。

  • ReadList,用于在应用或不应用筛选器的情况下检索外部项目的列表。可以通过 SharePoint Designer 对其进行建模。

  • StreamAccessor,用于读取 BLOB 字段并返回数据流。可以通过 SharePoint Designer 对其进行建模;您必须使用记事本或其他 XML 编辑器。

使用 SharePoint Designer 定义 ReadItem 和 ReadList 构造型

在以下步骤中,您将定义 ReadItem 操作和 ReadList 操作。

定义 ReadItem 和 ReadList 操作

  1. 在"服务器"功能区上的"新建"组中,单击"外部内容类型"。随即会打开用于创建外部内容类型的窗口。如表 1 所示设置属性。

    表 1. 用于创建外部内容类型的属性

    属性

    名称

    ProductDocument

    显示名称

    ProductDocument

    命名空间

    http://bcs.contoso.com

    版本

    1.0.0.0

    Office 项类型

    泛型列表

    脱机同步外部列表

    已启用

  2. 在功能区上的"视图"组中,单击"操作设计器视图"。

  3. 右键单击"文档"表以查看用于创建方法的选项。

  4. 单击"新建读取项目操作"。在"操作名称"字段中,单击"DocumentReadItem",然后单击"下一步"。

  5. 在"输入参数配置"中,选择"DocumentId"数据源元素,然后选择"映射到标识符"属性。您使用"DocumentId"列唯一标识文档信息。单击"下一步"。

  6. 在"返回参数"页上,重复步骤 5 中所执行的相同步骤。选择除包含 BLOB 的"[Document]"以外的所有字段。单击"完成"。

  7. 右键单击"文档"表,然后选择"新建读取列表"。在"操作名称"字段中,选择"DocumentReadList",单击"下一步"。

  8. 在"筛选参数配置"中,在"DocumentId"列上定义一个类型为"限制"的筛选器(其默认值为 10),以限制返回记录的数量。单击"下一步"。

  9. 在"返回参数"页上,确保已选择除"[Document]"以外的所有字段。单击"完成",然后保存外部内容类型。

定义 StreamAccessor 构造型

由于您无法使用 SharePoint Designer 对此构造型进行建模,因此您必须将在上一节中创建的模型导出到一个文件中,然后使用记事本或其他 XML 编辑器添加 StreamAccessor 操作。

创建 StreamAccessor 操作

  1. 在 SharePoint Designer 中的"导航"下,选择"外部内容类型"。外部内容类型的列表显示在右侧的窗格中。

  2. 在列表中,右键单击"ProductDocument"外部内容类型,然后选择导出模型的选项。对模型文件进行命名,然后保存。

  3. 复制下面的 XML,然后将其作为 <Methods> 标记的最后一个子节点粘贴在元数据 XML 文件中。

    <Method IsStatic="false" Name="DocumentReadStream">
                  <Properties>
                    <Property Name="BackEndObject" Type="System.String">Document</Property>
                    <Property Name="BackEndObjectType" Type="System.String">SqlServerTable</Property>
                    <Property Name="RdbCommandText" 
                    Type="System.String">SELECT [Document] FROM 
                     [Production].[Document] WHERE [DocumentID] = 
                    @DocumentID</Property>
                    <Property Name="RdbCommandType" 
                    Type="System.Data.CommandType, System.Data, 
                    Version=2.0.0.0, Culture=neutral, 
                    PublicKeyToken=b77a5c561934e089">Text</Property>
                    <Property Name="Schema" Type="System.String">Production</Property>
                  </Properties>
                  <AccessControlList>
                    <AccessControlEntry Principal="contoso\administrator">
                      <Right BdcRight="Edit" />
                      <Right BdcRight="Execute" />
                      <Right BdcRight="SetPermissions" />
                      <Right BdcRight="SelectableInClients" />
                    </AccessControlEntry>
                  </AccessControlList>
                  <Parameters>
                    <Parameter Direction="In" Name="@DocumentID">
                      <TypeDescriptor TypeName="System.Int32" 
                      IdentifierName="DocumentID" Name="DocumentID" />
                    </Parameter>
                    <Parameter Direction="Return" Name="DocumentRead">
                      <TypeDescriptor TypeName="System.Data.IDataReader, 
                      System.Data, Version=2.0.0.0, Culture=neutral, 
                      PublicKeyToken=b77a5c561934e089" 
                      IsCollection="true" Name="DocumentRead">
                        <TypeDescriptors>
                          <TypeDescriptor TypeName="System.Data.IDataRecord, 
                          System.Data, Version=2.0.0.0, Culture=neutral, 
                          PublicKeyToken=b77a5c561934e089" 
                          Name="DocumentReadElement">
                            <TypeDescriptors>
                              <TypeDescriptor TypeName="System.Byte[]" 
                              Name="Document" />
                            </TypeDescriptors>
                          </TypeDescriptor>
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </Parameter>
                  </Parameters>
                  <MethodInstances>
                    <MethodInstance Type="StreamAccessor" 
                    ReturnParameterName="DocumentRead" 
                    ReturnTypeDescriptorPath="DocumentRead[0].Document" 
                    Default="true" Name="DocumentReadStream" 
                    DefaultDisplayName="Document">
                      <Properties>
                        <Property Name="FileNameField" 
                        Type="System.String">FileName</Property>
                      </Properties>
                      <AccessControlList>
                        <AccessControlEntry 
                        Principal="contoso\administrator">
                          <Right BdcRight="Edit" />
                          <Right BdcRight="Execute" />
                          <Right BdcRight="SetPermissions" />
                          <Right BdcRight="SelectableInClients" />
                        </AccessControlEntry>
                      </AccessControlList>
                    </MethodInstance>
                  </MethodInstances>
                </Method>
    

    StreamAccessor 方法将外部项目的参数 ID 作为输入,并且应返回包含流的单个字段。在本示例中,DocumentId 字段唯一标识外部项目。返回参数为包含单个列数据记录的数据读取器。列名称为文档

表 2 显示可在定义 BLOB 处理方式的 MethodInstance 上配置的属性。

表 2. StreamAccessor 的属性

属性

说明

FileName

如果指定,则用作 BLOB 的文件名称。在下载文件时还显示为文件名称。外部内容类型的所有外部项目将使用同一名称。

示例:

<Property Name="FileName"

Type="System.String">document.docx</Property>

MimeType

如果指定,则在发送 BLOB 流以供下载时使用,并用于标识多用途 Internet 邮件扩展 (MIME) 类型。同时还供 SharePoint Server 搜索用于标识内容类型,以便使用适当的 IFilter 对内容编制索引。

示例:

<Property Name="MimeType"

Type="System.String">application/vnd.openxmlformats-

officedocument.wordprocessingml.document</Property>

MimeTypeField

指定每个外部项目是否有一个可在其中一个外部内容类型字段中使用的 MIME 类型。其为外部内容类型(从外部系统返回 MIME 类型)中 TypeDescriptor 的名称。

示例:

<Property Name="MimeTypeField"

Type="System.String">MimeTypeName</Property>

FileNameField

指定每个外部项目是否有一个可在 ECT 字段中使用的文件名称。其为外部内容类型(从外部系统返回文件名称)中 TypeDescriptor 的名称。

示例:

<Property Name="FileNameField"

Type="System.String">ResumeFileName</Property>

Business Connectivity Services 可以从包含在文件名称中的文件扩展名推断 MIME 类型。若要确定应将何种 MIME 类型用于流,请按照以下顺序检查元数据模型中的属性:

  1. FileNameField

  2. MIMETypeField

  3. MIMEType

  4. FileName

系统在确定 MIME 类型之后,将使用在 SharePoint 前端服务器(非客户端计算机)上定义的关联确定用于打开文件的应用程序。

如果用户单击链接,并且不存在任何 FileName/FileNameField 属性,则系统在"文件下载"对话框中显示 MethodInstanceName 作为文件名称。(回退顺序为:FileNameFieldFileNameLocalizedDisplayNameMethodInstanceName。)

如果系统无法确定 MIME 类型,则将内容传输到浏览器时使用"未知"作为 MIME 类型。在客户端计算机上,会要求用户选择打开文件的程序,如图 1 所示。

图 1. 程序选择提示

程序选择提示

下面的元数据示例显示 StreamAccessor MethodInstance。该类型指定为 StreamAccessor,而 FileNameField 指向从数据库表返回的 FileName 列。

                <MethodInstance Type="StreamAccessor"
                ReturnParameterName="DocumentRead"
                ReturnTypeDescriptorPath="DocumentRead[0].Document"
                ReturnTypeDescriptorLevel="1"
                Default="true" Name="DocumentReadStream"
                DefaultDisplayName="Document">
                  <Properties>
                    <Property Name="FileNameField"
                    Type="System.String">FileName</Property>
                  </Properties>
                  ...                    
                </MethodInstance>

SharePoint Server 2010 示例:使用 BCS 从外部系统访问 BLOB 数据(该链接可能指向英文页面)下载完整的元数据模型。

导入和配置模型

设计模型之后,下一步是将模型导入 Business Connectivity Services 元数据存储,并配置配置文件页。

导入和配置模型

  1. 在 SharePoint 管理中心中,选择管理 Business Connectivity Services 服务应用程序的选项。在可用元数据模型的列表中,选择您先前使用 SharePoint Designer 创建的模型,然后删除该模型。执行此步骤的原因是因为如果存在具有相同名称的现有模型,则无法导入模型文件。

  2. 按照管理 BDC 模型 (SharePoint Server 2010) (Microsoft TechNet) 的导入 BDC 模型一节中的步骤,将元数据模型导入服务应用程序中。本文的末尾有可供下载的完整元数据模型。

  3. 执行权限指定给将用于访问外部内容类型方法的帐户,如管理 BDC 模型 (SharePoint Server 2010)对 BDC 模型设置权限一节中所示。

  4. http://bcs.contoso.com/profile 上创建配置文件页宿主网站,然后按照管理外部内容类型 (SharePoint Server 2010) (Microsoft TechNet) 的为 Business Data Connectivity Service 应用程序实例指定配置文件页宿主一节中的步骤,为 ProductDocument 外部内容类型创建配置文件页。确保要查看外部内容类型的用户和用于对外部内容类型爬网的帐户具有配置文件宿主网站的读取访问权限。

使用 Business Connectivity Services Web 部件

在业务数据 Web 部件中实施功能来处理 BLOB 字段。它在呈现某个外部项目时,如果 Business Connectivity Services 运行时遇到为其定义 StreamAccessor 方法的字段,则 Web 部件会呈现一个以文件形式下载流的链接。

如果某个用户单击"单击此处下载"链接,Business Connectivity Services 运行时会从业务线 (LOB) 系统请求文件(流)。当检索整个流时,Business Connectivity Services 确定适当的 MIME 类型,并将其传递给客户端的默认 Web 浏览器。这提示用户保存文件,或使用为该文件扩展名注册的默认应用程序打开文件。如果没有关联的默认应用程序,则提示用户选择一个应用程序。

此功能在本机提供,无需在 UI 中进行自定义。"单击此处下载"链接将请求导航至 LAYOUTS 文件夹中的 downloadexternaldata.aspx 页,以读取流并将其发送到浏览器。

配置 Web 部件以显示带有流字段的外部内容类型

  1. 导航至 http://bcs.contoso.com/profile,然后添加业务数据列表 Web 部件。指定"ProductDocument"作为外部内容类型,如图 2 所示。

    图 2. Web 部件属性

    Web 部件属性

  2. 保存页面之后,随即会刷新页面,并且列表 Web 部件从外部系统中检索数据和显示列表,如图 3 所示。请注意"文档"列,它会显示可下载 BLOB 的链接。

    图 3. 业务数据列表 Web 部件中的外部项目

    业务数据列表 Web 部件中的外部项

所有 Business Connectivity Services Web 部件都能识别流并在外部内容类型实施 StreamAccessor 方法时显示此行为。

如果使用带有流字段的外部内容类型创建外部列表,则列表不会显示可下载内容的链接。

搜索 BLOB

定义外部内容类型之后,SharePoint Search 可以对外部数据进行爬网并对流编制索引。以下为启用 BLOB 搜索的先决条件:

  • 通过为 BLOB(要对其编制索引)定义的 StreamAccessor 方法创建外部内容类型。

  • 启动 SharePoint Search Service,并创建要搜索的服务应用程序。

  • 通过 AdventureWorksLobSystemInstance 外部系统将业务部门数据类型的内容源定义为要对其进行爬网的外部数据源。

  • http://bcs.contoso.com/profile 上为 ProductDocument 外部内容类型创建配置文件页。

  • 爬网帐户具有连接至 AdventureWorks 数据库的权限,而且其具有 http://bcs.contoso.com/profile 中内容的读取权限。

在您具备所有的先决条件后,开始对内容源进行全面爬网。通过验证爬网日志确保成功完成对内容的爬网。

搜索文档内容中的任何项目,并验证是否能够返回有关该项目的结果。在本示例中,搜索词汇 cycle。您将收到来自外部系统的一个结果,如图 4 所示。生成项目 URL 是本文前面导入和配置模型中的步骤 4 创建的配置文件页。

图 4. 搜索结果

搜索结果

单击搜索结果中的链接可使您转到配置文件页,您可以在其中查看外部项目的详细信息。请注意,业务数据项 Web 部件显示可下载 BLOB 文件的链接,如图 5 所示。

图 5. 产品文档配置文件页

"产品文档"配置文件页

如果您单击"单击此处下载"链接,则会显示"文件下载"对话框,如图 6 所示。您可以保存文件或打开进行查看。

图 6. 文件下载对话框

"文件下载"对话框

结论

目前为止,还不能在 SharePoint Server 中从外部系统轻松访问 BLOB 数据。在 Microsoft SharePoint Server 2010 中,通过向 Web 部件、SharePoint Server 搜索 和 Business Connectivity Services 对象模型添加的新功能,您可以使用 Business Connectivity Services 创建可从外部系统访问 BLOB 数据的复杂应用程序。

其他资源

有关 Business Connectivity Services 的详细信息,请参阅以下资源: