Partager via


将 SQL Azure 与 SharePoint 2010 和 Windows Azure 集成

将 SQL Azure 与 SharePoint 2010 和 Windows Azure 集成

在阅读我的有关 CASI(声明、Azure 和 SharePoint 集成)工具包的系列文章(共五部分)时,如果结合阅读本文章则会受益匪浅。

·         第 1 部分: 概括性介绍整个框架和解决方案并说明本系列文章要尝试解决的问题及涵盖的内容。

·         第 2 部分: CASI 工具包的指南部分。 首先使 WCF 成为所有数据(包括数据集、Xml、自定义类或者仅仅只是 Html)的前端。 在第一阶段,我们采用标准 WCF 服务,并使其能够识别声明,这样,我们便可从 SharePoint 获取用户令牌,并通过应用程序或数据中心边界将其发送到自定义 WCF 应用程序。 在第二阶段,我将列出要将此典型 WCF 应用程序从内部部署转换为承载在 Windows Azure 中所要执行的全部操作的列表。 完成后,您将可以使用后端来通过集成的身份验证支持多应用程序、多数据中心。

·         第 3 部分: 介绍自定义工具包程序集,以便能够在云和 SharePoint 场中连接您的声明感知 WCF 应用程序。 我将介绍如何使用程序集,讨论需要创建的非常简单的自定义控件(约 5 行代码),以及如何将其承载在 _layouts 目录中的页面中以便检索和呈现 Web 部件中的数据。 还将发布自定义控件示例和 _layouts 页面的完整源代码。

·         第 4 部分: CASI 工具包中的 Web 部件。 该 Web 部件提供现成的无代码解决方案,使您能够挂接并连接到异步客户端查询,以从云承载的服务中检索数据,然后将其显示在 Web 部件中。 该 Web 部件中还内置了挂钩,以便您能够对其进行大量自定义,并使用自己的 JavaScript 函数来呈现数据。

·         第 5 部分: 简单演练几个应用程序示例,以演示使用您在第 3 部分中构建的自定义控件的其他一些情况。 其中一种情况是使用此控件来检索某些类型的用户或配置数据,并将该数据存储在 ASP.NET 缓存中,然后在自定义 Web 部件中使用它。 另一种情况是使用自定义控件来从 Azure 中检索数据,并将该数据用于自定义任务;在本示例中,为自定义 SharePoint 计时器作业。 还将发布这些应用程序示例的完整源代码。

通过 CASI 工具包,我为您提供了一些指南和工具来帮助您相当轻松且快速地从 SharePoint 2010 连接到 Windows Azure,同时为当前用户发送令牌,以便您可以做出非常精细的安全决策。 CASI 工具包使用的原始 WCF 应用程序只是使用它公开的硬编码数据集合。 在后续版本中(确实没有在 CASI 工具包文章中记录),我升级了该工具包的数据部分,以便它使用 Windows Azure 表存储来存储和检索数据。 现在,我通过在 SQL Azure 中生成数据并让 Windows Azure 中我的 WCF 从那里检索数据来对该工具包进行稍微改进。 现在,这确实是一个多云应用程序套件: Windows Azure、SQL Azure 和(明显的)SharePoint Online。 本文章的目的实际上只是共享一些 SQL Azure 使用提示,以便您可以更快速地将它合并到您的开发项目中。

集成提示

1. 您确实必须升级到 SQL 2008 R2 才能使用 SQL Server Management Studio 工具打开 SQL Azure 数据库。 您可以采取技术手段使 SQL Server 2008 可用,但实现此目的的步骤比较繁琐。 2008 R2 提供了现成功能,您将从那里获得最佳体验。 如果您确实希望采用 2008 替代方法,请查看以下链接: https://social.technet.microsoft.com/wiki/contents/articles/developing-and-deploying-with-sql-azure.aspx(该链接可能指向英文页面)。 本文确实提供了一些好的提示,因此不管怎样,它都值得一读。

2. 计划使用 T-SQL 来完成所有工作。 图形工具不可用于处理 SQL Azure 数据库、表、存储过程等。 另外,由于我不是真正的 T-SQL 行家,我发现首先创建本地 SQL Server 数据库会有所帮助。 在 SQL 管理工具中,我创建两个连接 – 一个连接到我的本地 SQL 实例,一个连接到我的 SQL Azure 实例。我在本地 SQL 实例中创建表、存储过程等,以便可以使用图形工具。 然后,我使用“Script [随便什么 Sql 对象] As...CREATE to...New Sql Query”窗口。 这会生成 SQL 脚本来创建我的对象,然后我可以将它粘贴到我为 SQL Azure 数据库打开的查询窗口中。

3. 这一点非常重要 – 默认超时经常不够长,无法连接到 SQL Azure。 如果您在连接字符串中使用 .NET SqlClient 类,则可以更改超时时间,即添加“Connection Timeout=30;”。 如果您使用 SQL Server Management Studio,可单击您在其中输入服务器名称和凭据的对话框中的“高级”按钮,然后将超时时间更改为至少为 30。 默认值为 15 秒,这经常失败,但 30 秒似乎足够用。 遗憾的是,没有办法更改外部内容类型(即 BDC 应用程序定义)到 SQL Azure 数据源的连接超时。

4. 不要使用数据库管理员帐户来连接到您的数据库(即,您获得的用于创建数据库本身的帐户)。 创建单独的帐户来使用数据。 遗憾的是,SQL Azure 只支持 SQL 帐户,因此您无法直接使用请求用户的标识来作出有关访问数据的决策。 您可以通过使用作为 SQL Azure 中数据的前端的 WCF 应用程序和使用 Windows Azure 中的声明身份验证来解决此问题,这正是 CASI 工具包所采用的模式。 另外,还需要执行一些步骤来创建可用于连接到特定数据库中数据的登录。 下面是一个示例:

-- 首先创建数据库

CREATE DATABASE Customers

-- 现在创建登录,然后在数据库中从登录创建用户

CREATE LOGIN CustomerReader WITH PASSWORD = 'FooBarFoo'

CREATE USER CustomerReader FROM LOGIN CustomerReader

-- 现在向用户授予权限

GRANT INSERT, UPDATE, SELECT ON dbo.StoreInformation TO CustomerReader

-- 授予对存储过程的执行权限

GRANT EXECUTE ON myStoredProc TO CustomerReader

有关更多示例和详细信息,包括为 SQL Azure 中的帐户设置服务器级别权限,请参阅 https://msdn.microsoft.com/zh-cn/library/ee336235.aspx(该链接可能指向英文页面)

5. 您 必须在 SQL Azure 中为您拥有的每个数据库创建防火墙规则,以允许来自不同客户端的通信。 如果您希望允许来自其他 Azure 服务的通信,则必须创建 MicrosoftServices 防火墙规则(当您首次创建数据库时,SQL Azure 会为您创建它),它的起始范围为 0.0.0.0 至 0.0.0.0。 如果您没有创建此规则,则您的所有 Windows Azure 应用程序都将无法读取、添加或编辑来自您的 SQL Azure 数据库的数据! 您还应创建一条防火墙规则来允许与您用于传送到 Internet 的任何服务器通信。 例如,如果您有电缆或 DSL 路由器或 RRAS 服务器,则需要使用 RRAS 之类的外部地址或 NAT 地址。

 

上面应该是一些使您的数据正常运行的有用提示。

 

数据访问

从您的自定义代码(Windows Azure WCF、Web 部件等)访问数据本身的过程几乎与从内部部署 SQL Server 检索数据的过程完全相同。 下面是一个简单的代码示例,稍后我将较详细地演练其中一部分内容:

//set a longer timeout because 15 seconds is often not

//enough; SQL Azure docs recommend 30

private string conStr = "server=tcp:foodaddy.database.windows.net;Database=Customers;" +

"user ID=CustomerReader;Password=FooBarFoo;Trusted_Connection=False;Encrypt=True;" +

"Connection Timeout=30";

private string queryString = "select * from StoreInformation";

private DataSet ds = new DataSet();

using (SqlConnection cn = new SqlConnection(conStr))

{

SqlDataAdapter da = new SqlDataAdapter();

da.SelectCommand = new SqlCommand(queryString, cn);

da.Fill(ds);

//do something with the data

}

实际上,这里除了连接字符串之外确实没有要解释说明的内容。 值得指出且可能与内部部署 SQL Server 的典型连接不同的主要事项是:

· server: 在 SQL Azure 数据库名称前面添加“tcp:”。

· Trusted_Connection:这应为 false,因为您没有使用集成安全性

· Encrypt: 对于与云承载的数据库的任何连接,这应为 true

· Connection Timeout: 如上所述,默认超时为 15 秒,这经常不够用;在这里,我将它设置为 30 秒。

在这里,我想简单说明的另一个情形是使用数据迁移。 您可以使用 SQL Server 附带的 BCP 工具将数据从内部部署 SQL Server 移动到 SQL Azure。 迁移数据的基本例程如下:

1. 创建一个格式文件 – 用于导出本地数据并将其导入云中。 在该示例中,我为 Test 数据库中的 Region 表创建格式文件,并将它保存为文件 region.fmt。

bcp Test.dbo.Region format nul -T -n -f region.fmt

2. 从本地 SQL 导出数据 – 在该示例中,我将 Test 数据库中的 Region 表导出到名为 RegionData.dat 的文件。 我使用在步骤 1 中创建的 region.fmt 格式文件。

bcp Test.dbo.Region OUT RegionData.dat -T -f region.fmt

3. 将数据导入 SQL Azure。 这里必须注意的主要事项是当您将数据导入云中时,必须在用户名参数中包括“@serverName”;否则导入将失败。 在该示例中,我将数据导入 SQL Azure 中 Customers 数据库中的 Region 表中。 我从将本地数据导出到的 RegionData.dat 文件导入。 我的服务器名称(-S 参数)是 SQL Azure 数据库的名称。 对于我的用户名(-U 参数),我使用 username@servername 格式,如上所述。 我告诉它使用我在步骤 1 中创建的 region.fmt 格式文件,并且我将批量大小(-b 参数)设置为一次 1000 个记录。

bcp Customers.dbo.Region IN RegionData.dat -S foodaddy.database.windows.net -U speschka@foodaddy.database.windows.net -P FooBarFoo -f region.fmt -b 1000

 

这就是面向本文章读者的所有内容。 希望这些内容能够使您很好地了解创建 SQL Azure 数据库并在您的 SharePoint 网站中连接和使用该数据库的基本技术。 补充说明一点,我使用 CASI 工具包通过 SQL Azure 的 Windows Azure WCF 前端检索此数据并在 SharePoint 网站中呈现此数据。 在创建数据库时,我按照自己的 CASI 工具包博客内容操作以尝试验证我以前在这里发布的所有内容,总体而言,我发现这些内容几乎完全正确。 我在第 3 部分中进行了几处微小更正,并另外添加了一个有关问题排查的简单节。 但总得来说,创建新的自定义控件花费了我 30 分钟左右的时间,创建新的直观 Web 部件花费了我大约 15 分钟的时间。 我使用 CASI 工具包 Web 部件来从 WCF 显示一组 SQL Azure 数据,并且在直观 Web 部件中,我以编程方式创建了自定义控件的实例来检索数据集,然后将它绑定到 ASP.NET 网格。 我将所有这些内容集中在一个示例页面中,该页面实际看上去非常好,而且可以非常轻松地进行扩展以采用许多不同方式显示数据。 下面是该页面的外观:

这是一篇本地化的博客文章。请访问 Integrating SQL Azure with SharePoint 2010 and Windows Azure 以查看原文