SharePoint Online 中的 Business Connectivity Services 简介

**摘要:**了解使用 Microsoft Business Connectivity Services (BCS) 为 Microsoft SharePoint Online 开发应用程序的基本概念、最佳实践和设计模式。

上次修改时间: 2011年12月12日

在 SharePoint Online 中提供

本文内容
什么是 Business Connectivity Services?
外部内容类型
BDC 模型
外部列表
外部数据列
业务数据 Web 部件
外部内容类型选取器
外部项选取器
安全存储
SharePoint 客户端对象模型
开发 BCS 应用程序
结论
其他资源

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

**供稿人:**Rodney Farris,Microsoft Corporation

目录

  • 什么是 Business Connectivity Services?

  • 外部内容类型

  • BDC 模型

  • 外部列表

  • 外部数据列

  • 业务数据 Web 部件

  • 外部内容类型选取器

  • 外部项选取器

  • 安全存储

  • SharePoint 客户端对象模型

  • 结论

  • 其他资源

什么是 Business Connectivity Services?

Microsoft Business Connectivity Services (BCS) 以前称为业务数据目录,使用户能够通过 Web 服务、数据库以及 Microsoft .NET Framework 从 Microsoft SharePoint 2010 和 Microsoft SharePoint Online 中读取外部系统中的数据以及将数据写入外部系统。SharePoint 2010 和 SharePoint Online 具有可直接使用外部数据的功能。开发人员可以通过使用熟悉的工具(例如 Microsoft Visual Studio 2010 和 Microsoft SharePoint Designer 2010),访问丰富的功能集并快速构建解决方案。

如果您不熟悉 SharePoint Online,本文正好适合您。它介绍使用 BCS 为 SharePoint Online 开发应用程序所需的基本概念、最佳实践和设计模式。本文假定您熟悉基本 SharePoint 概念并具有 SharePoint 应用程序开发中涉及的模式的相关经验。

提示提示

有关 SharePoint Online 的最佳实践和设计模式的信息,请参阅 SharePoint Online:概述(针对开发人员)

外部内容类型

BCS 的核心概念是外部内容类型。外部内容类型是 SharePoint Online 中存储的可重用连接定义,利用这些定义,无需知道基础连接详细信息,便可访问外部数据。

这些定义包含连接信息和数据定义的元数据说明以及您要应用于某种类别的外部数据的行为。利用外部内容类型,您可以从一个中心位置管理和重用业务实体(例如客户或订单)的元数据和行为,并且用户可以通过更有意义的方式与该外部数据和流程进行交互。

例如,考虑"客户"等业务实体。您可能希望与 SharePoint 列表中"客户"类型的项目进行交互。或者,您可能希望允许用户从 Web 部件中的客户列表中选取客户。您可以创建一次外部内容类型,然后在需要它的任何位置重用它。

备注

外部列表的架构依赖 XML 中定义的 BDC 模型(将在下一节中进行讨论),无法像普通列表那样通过向列表中添加新列来进行扩展。在此版本中,外部列表没有提供典型 SharePoint 列表所提供的全部功能,例如工作流、内容类型、版本控制、签入和签出。

外部内容类型提供以下好处:

  • 可重用性   外部内容类型是业务实体的可重用数据定义。创建外部内容类型后,可将其与 BCS 中的任一演示功能一起使用,以提供与外部数据交互的丰富用户体验。

  • 简化了对外部系统的访问   利用外部内容类型,信息工作者无需处理这些系统的复杂性(例如,连接信息或可编程性接口)即可构建业务解决方案。在有经验的用户或开发人员创建一个外部内容类型后,任何用户都可按任何所需方式使用该类型(前提是,这些用户有权执行该操作和访问该外部数据)。不过,用户无需了解有关外部数据的位置或如何连接外部数据的任何信息。

  • 内置 SharePoint 行为   外部内容类型为外部数据和服务提供 SharePoint 行为(例如列表和 Web 部件)及功能(例如搜索或脱机工作功能),因此用户可在其熟悉的工作环境中工作,而无需搜寻数据或了解不同的(专有)用户界面并与之交互即。

  • 安全访问   外部内容类型具有外部系统和 SharePoint 产品和技术实现的安全性。可通过配置 SharePoint 中的安全性来完全控制哪些用户可以访问哪些数据。

  • 简化维护   因为外部内容类型创建一次便可由不同情况下的多个解决方案使用,所以可轻松管理它们。例如,可以在一个中心位置管理其访问权限以及连接和数据定义。

BDC 模型

BDC 模型 是 Business Data Connectivity (BDC) Service 的核心。提取有关外部系统的复杂详细信息的数据结构(例如实体(外部内容类型)和方法)统称为 MetadataObjects 并构成 BDC 模型。外部系统的 BDC 模型实质上是一个 XML 文件。使用 SharePoint Designer 2010 时,将自动生成此文件。不过,如果使用的是 Visual Studio 或其他 XML 编辑实用工具,则必须根据已发布的 BDC 架构手动生成 BDC 模型。

外部列表支持写回外部系统(如果外部系统允许,并且外部内容类型可相应地对其建模)。这表明用户可直接从 SharePoint Online 编辑外部数据。对列表项所进行的任何更改都会自动与外部系统同步。通过使用列表中的"刷新数据"按钮,您可以自动从外部系统同步和获取更新的数据。

外部列表

外部列表 允许以访问 SharePoint 列表数据的相同方式访问外部系统中的数据。外部列表使用外部内容类型作为其数据源。外部列表允许您使用已定义的、有关外部内容类型的元数据来创建具有外部数据,并且其外观和执行方式与任何其他 SharePoint 列表相同的 SharePoint 列表。

备注

与数据存储在 SharePoint 内容数据库中的 SharePoint 列表不同,外部列表中的数据只存储在外部系统中。当您导航到列表时,外部数据会在运行时导入 SharePoint 列表中,但原始数据仍保留在外部系统中。

外部数据列

Microsoft Office SharePoint Server 2007 提供了现在可用于 SharePoint Online 中的所有 SharePoint 列表(外部列表除外)的业务数据列表列类型。业务数据列表列类型现在名为外部数据列,用户可利用它将数据从外部内容类型添加到标准 SharePoint 列表。与外部列表一样,外部数据列可以显示在 BDC 中建模的任何外部内容类型的数据。图 1 显示了使用外部数据列从客户外部内容类型扩展的 SharePoint 列表。

图 1. 添加了外部数据列的 SharePoint 列表

添加了外部数据列的 SharePoint 列表

业务数据 Web 部件

BCS 提供了以下 Web 部件来访问外部内容类型展现的只读数据:

  • 外部数据列表

  • 外部数据项

  • 外部数据项生成器

  • 外部数据相关项列表

  • 外部数据连接筛选器

有关详细信息,请参阅可在什么位置显示外部数据?

外部内容类型选取器

外部内容类型选取器 提供了从 SharePoint Online 中的可用外部内容类型列表中选择预定义外部内容类型的方法。

外部项选取器

外部项选取器 为服务器上和丰富客户端 Microsoft Office 应用程序中的外部项提供选取和解析功能。您可以针对用户应能够在其中选取外部项(例如从客户列表中选取客户"John")的方案,在表单或页面中嵌入选取器。

安全存储

Secure Store Service 是一种提供凭据(例如帐户名称和密码)的存储和映射的共享服务。利用它,您可以安全地存储提供连接到外部系统所需的凭据并将这些凭据与特定标识或一组标识相关联的数据。您可以配置 Secure Store Service,以便多个用户可以在外部系统上使用一组凭据访问该外部系统。

备注

安全存储是 SharePoint Online 中针对外部系统对用户进行身份验证所支持的唯一机制。

例如,如果名为"Fred"的用户具有一个托管在 SharePoint Online 上的用户帐户并具有另一个托管在 Windows Communication Foundation (WCF) 应用程序中的用户帐户,则 SharePoint Secure Store Service 机制允许其 WCF 凭据映射到安全存储中的某个组。因此,如果他从 SharePoint Online 中使用解决方案获取 WCF 应用程序中的数据,则 SharePoint Online 会查找服务器上的 Secure Store Service 数据库并代表 Fred 将组凭据提供给 WCF 服务。这样,Fred 便能够访问 WCF 服务保护的数据,而无需提供单独的登录信息。

SharePoint 客户端对象模型

SharePoint 客户端对象模型提供了从浏览器中的客户端应用程序与 SharePoint 网站交互的方法。

客户端对象模型提供了 SharePoint 服务器对象模型中的核心对象的三种并行的可比较表示形式:.NET Framework 托管模型、Microsoft Silverlight 模型和 JavaScript 模型。这些客户端对象模型提供对 SharePoint 数据和功能的远程访问。

客户端对象模型是基于 SPList 类构建的,用于通过 SharePoint Web 服务从客户端执行 CRUD 操作。

开发 BCS 应用程序

在您开始开发 BCS 应用程序时,了解以下信息会有所帮助。

用于开发 BCS 应用程序的工具

用于为 BCS 开发应用程序和组件的选项实质上有两个:Visual Studio 2010 和 SharePoint Designer 2010。不过,由于目前不允许使用自定义代码从 SharePoint Online 连接到外部数据源,因此首选工具是 SharePoint Designer 2010。

SharePoint Designer 2010 简化了 SharePoint 应用程序的开发,并为 Visual Studio 开发人员提供了无需代码的快速开发应用程序的绝佳工具。

创建外部内容类型和关联

如上所述,外部内容类型是包含连接信息和数据定义的元数据以及您要应用于某种类别的外部数据的行为的可重用集合。创建外部内容类型通常是使用 BCS 将外部数据源中的数据导入 SharePoint Online 的第一步。在具有外部内容类型后,可以将其与 BCS 的各种演示功能中的任意一种结合使用,例如外部列表、外部数据列以及用于在 SharePoint Online 中显示外部数据的 Office 应用程序的外部内容控件。

在 SharePoint Online 中创建外部内容类型涉及以下步骤:

  1. 创建用于公开外部数据源和您希望允许用户执行的操作的 WCF 端点。

  2. 使用 SharePoint Designer 或 Visual Studio 创建使用所需凭据连接到 WCF 服务的外部内容类型。

  3. 创建将 SharePoint Online 用户映射到 WCF 服务允许的用户帐户的 Secure Store Service 条目。

  4. 使用新创建的外部内容类型创建外部列表。

有关结合使用 SharePoint Designer 和 SharePoint Online 创建外部内容类型的详细信息,请参阅以下资源:

下面的示例演示如何定义 BDC 模型来连接到 WCF 服务。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Model Name="ExampleApplicationDefinition" 
 xmlns="https://schemas.microsoft.com/windows/2007/BusinessDataCatalog">
  <LobSystems>
    <LobSystem Name="ExampleCRM" Type="Wcf">
      <Properties>
        <Property Name="WcfMexDiscoMode" Type="System.String">Disco</Property>
        <Property Name="WcfMexDocumentUrl" Type="System.String">http://example.org/?wsdl</Property>
        <Property Name="WcfProxyNamespace" Type="System.String">ExampleCrmNamespace</Property>
        <Property Name="WsdlFetchAuthenticationMode" Type="System.String">PassThrough</Property>
      </Properties>
      <LobSystemInstances>
        <LobSystemInstance Name="ExampleServer">
          <Properties>
            <Property Name="WcfAuthenticationMode" Type="System.String">PassThrough</Property>
            <Property Name="WcfEndpointAddress" Type="System.String">http://example.org</Property>
          </Properties>
        </LobSystemInstance>
      </LobSystemInstances>
      <Entities>
        <Entity Name="Customer" Namespace="example.com" Version="1.0.0.0">
          <Identifiers>
            <Identifier Name="CustomerIdentifier" TypeName="System.Int32" />
          </Identifiers>
          <Methods>
            <Method Name="GetCustomers">
              <Parameters>
                <Parameter Name="CustomerId" Direction="In">
                  <TypeDescriptor Name="Id" TypeName="System.Int32" 
                   IdentifierName="CustomerIdentifier" />
                </Parameter>
                <Parameter Name="Customers" Direction="Return">
                  <TypeDescriptor Name="CustomerArray" 
                   TypeName="ExampleCrmNamespace.Customer[], ExampleCRM" IsCollection="true">
                    <TypeDescriptors>
                      <TypeDescriptor Name="Customer" 
                       TypeName="ExampleCrmNamespace.Customer, ExampleCRM">
                        <TypeDescriptors>
                          <TypeDescriptor Name="Id" 
                           TypeName="System.Int32" IdentifierName="CustomerIdentifier" />
                          <TypeDescriptor Name="FirstName" TypeName="System.String" />
                          <TypeDescriptor Name="LastName" TypeName="System.String" />
                        </TypeDescriptors>
                      </TypeDescriptor>
                    </TypeDescriptors>
                  </TypeDescriptor>
                </Parameter>
              </Parameters>
              <MethodInstances>
                <MethodInstance Name="GetCustomer" Type="SpecificFinder" 
                 ReturnParameterName="Customers" 
                 ReturnTypeDescriptorPath="CustomerArray[0]" />
              </MethodInstances>
            </Method>
          </Methods>
        </Entity>
      </Entities>
    </LobSystem>
  </LobSystems>
</Model>

有关创建 BDC 模型的详细信息,请参阅以下资源:

备注

请注意,虽然我们演示了如何连接到多种类型的外部系统,但目前 SharePoint Online 只允许 WCF 连接。

使用客户端对象模型处理 BCS

若要在 SharePoint Online 中以编程方式处理外部数据,您必须使用客户端对象模型。因为客户端对象模型 API 远程执行,所以它们不受适用于沙盒或服务器端解决方案的相同限制的约束。

对 BCS 使用客户端对象模型就像处理 SharePoint 的本机数据。下面的代码示例演示如何检索特定列表中的项目。

using System;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main()
    {
        ClientContext clientContext = new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists.GetByTitle("Customer Info");
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml = "<View/>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(list);clientContext.Load(listItems);
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems)
            Console.WriteLine("Id: {0} Title: {1}", listItem.Id, oListItem["Title"]);
    }
}

使用客户端对象模型更新客户端对象相当简单。只需检索对象,更改属性,对更改的每个对象调用 Update 方法,然后调用 ExecuteQuery 方法即可。下面的示例修改 Client API Test List 中的项目,从而将所有开发项目的估计值增加 50%(一种常见操作)。

using System;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main(string[] args)
    {
        ClientContext clientContext = new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists.GetByTitle("Client API Test List");
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml =
            @"<View>
                <Query>
                  <Where>
                    <Eq>
                      <FieldRef Name='Category'/>
                      <Value Type='Text'>Development</Value>
                    </Eq>
                  </Where>
                </Query>
                <RowLimit>100</RowLimit>
              </View>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(
             listItems,
             items => items.Include(
                 item => item["Category"],
                 item => item["Estimate"]));
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems)
        {
            listItem["Estimate"] = (double)listItem["Estimate"] * 1.5;
            listItem.Update();
        }
        clientContext.ExecuteQuery();
    }
}

删除客户端对象同样简单。不过,从客户端对象集合中删除客户端对象时有一个非常重要的变化。无法循环访问该集合,从而删除对象。在删除第一个对象后,将立即导致客户端对象集合的迭代器出现故障。该迭代器可能引发异常,也可能安静地完成但不访问集合中的全部项目。必须使用 ToList 方法将集合具体化为 List<T>,然后循环访问该列表,从而删除客户端对象。

下面的示例从 Client API Test List 中删除测试项目。它演示在循环访问集合之前使用 ToList 方法具体化集合。

using System;
using System.Linq;
using System.Collections.Generic;
using Microsoft.SharePoint.Client;

class Program
{
    static void Main(string[] args)
    {
        ClientContext clientContext = new ClientContext("http://intranet.contoso.com");
        List list = clientContext.Web.Lists.GetByTitle("Client API Test List");
        CamlQuery camlQuery = new CamlQuery();
        camlQuery.ViewXml =
            @"<View>
                <Query>
                  <Where>
                    <Eq>
                      <FieldRef Name='Category'/>
                      <Value Type='Text'>Test</Value>
                    </Eq>
                  </Where>
                </Query>
                <RowLimit>100</RowLimit>
              </View>";
        ListItemCollection listItems = list.GetItems(camlQuery);
        clientContext.Load(
             listItems,
             items => items.Include(
                 item => item["Title"]));
        clientContext.ExecuteQuery();
        foreach (ListItem listItem in listItems.ToList())
            listItem.DeleteObject();
        clientContext.ExecuteQuery();
    }
}

有关使用客户端对象模型的详细信息,请参阅以下资源:

结论

BCS 是用于聚合和使用 SharePoint 的外部系统中的数据的强大工具。从 2011 年 11 月的服务更新开始,开发人员能够在其 SharePoint Online 应用程序中使用 BCS。

其他资源

有关详细信息,请参阅以下资源: