声明、Azure 和 SharePoint 集成工具包(第 5 部分)

声明、Azure 和 SharePoint 集成工具包(第 5 部分)

这是 CASI(声明、Azure 和 SharePoint 集成)工具包系列文章的第 5 部分,本系列共 5 部分。 第 1 部分概括性介绍整个框架和解决方案并说明本系列文章要尝试解决的问题及涵盖的内容。 第 2 部分提供有关创建 WCF 应用程序并使其能够识别声明,然后将其移到 Windows Azure 的指南。 第 3 部分演练将 SharePoint 网站与 Azure 数据挂接(通过向 _layouts 目录中的页面添加一个新的自定义控件)时将会使用的基类。 第 4 部分介绍随 CASI 工具包提供的 Web 部件及其用法,以及 Web 部件的各种属性等内容。 在本系列的最后一篇文章中,我将演练此工具包的其他两个核心方案 – 使用您在第 3 部分中构建的自定义控件来检索 Azure 数据并将数据存储在 ASP.NET 缓存中以用于其他控件,以及在 SharePoint 任务(在本例中为自定义 SharePoint 计时器作业)中使用此数据。

在其他 Web 部件中使用控件

需要支持的核心方案之一是使用 CASI 工具包框架检索要在其他 SharePoint Web 部件中使用的数据。 但还有其他设计目标,即不将常规服务器端调用引入潜在远程 WCF 终结点。 若要尝试满足这两个不同要求,基类需实现对直接检索数据并将其存储在 ASP.NET 缓存中的支持。 这将允许您开发其他自定义 Web 部件并遵循相当简单的模式:

1. 检查您的数据是否位于 ASP.NET 缓存中。

a. 如果是,请从中检索数据

b. 如果不是:

                                                              i. 创建自定义控件实例

                                                            ii. 将 OutputType 设置为 ServerCache,并将 ServerCacheName 和 ServerCacheTime 设置为适当的值

                                                          iii. 调用 ExecuteRequest 方法并获取数据

首先,启动一个新的 Visual Studio 项目 – 在本例中,我将假定 Visual Studio 2010,因此我们可以创建一个新的 SharePoint 2010 项目。 配置您的项目以创建新 Web 部件,然后您需要添加两个引用 – 一个引用 CASI 工具包基类,另一个引用您在第 3 部分中编写的自定义控件。 请注意,如果您没有添加对 CASI 工具包基类的引用,则当您尝试设置您的控件上的任何属性时,Visual Studio 将为属性添加红色波形下划线,并告诉您找不到该属性。 如果您看到此类错误,就会知道您尚未添加对 CASI 工具包基类的引用。

在设置引用后,您可以编写适合您的 Web 部件的任何代码。 在您到达需要从 Azure 中提取数据(可能是内容、配置信息等等)的位置时,下面是如何实现上述模式的一个示例:

string CACHE_NAME = "AzureConfigConsumerCacheSample";

int CACHE_TIME = 10;

//create a var of the type of configuration data we want to retrieve

AzureWcfPage.CustomersWCF.Customer[] Customers = null;

//look for our item in cache

if (HttpContext.Current.Cache[CACHE_NAME] != null)

{

//if we find, it cast it to our type and pull it out of cache

       Customers =

(AzureWcfPage.CustomersWCF.Customer[])

HttpContext.Current.Cache[CACHE_NAME];

}

else

{

//if it's not in cache, then retrieve it and put it into cache

       //create an instance of the control

       AzureWcfPage.WcfDataControl cfgCtrl = new AzureWcfPage.WcfDataControl();

       //set the properties to retrieve data

       cfgCtrl.WcfUrl = "https://azurewcf.vbtoys.com/Customers.svc";

       cfgCtrl.OutputType = AzureConnect.WcfConfig.DataOutputType.ServerCache;

       cfgCtrl.ServerCacheName = CACHE_NAME;

       cfgCtrl.ServerCacheTime = CACHE_TIME;

       cfgCtrl.MethodName = "GetAllCustomers";

       //execute the method

       bool success = cfgCtrl.ExecuteRequest();

       if (success)

       {

//get the strongly typed version of our data

//the data type needs to come from the control we are creating

Customers =

(AzureWcfPage.CustomersWCF.Customer[])cfgCtrl.QueryResultsObject;

              //if you wanted the Xml representation of the object you can get

              //it from QueryResultsString

  string stringCustomers = cfgCtrl.QueryResultsString;

}

       else

       {

              //there was some problem; plug in your error handling here

       }

}

让我们进一步查看某些代码。 首先,必须了解您不需要在您的新 Web 部件中添加对 WCF 终结点的服务引用。 所有内容均封装在您的自定义控件中,因此您可以使用通过自定义控件公开的 WCF 应用程序的返回类型。 此行代码演示:

//create a var of the type of configuration data we want to retrieve

AzureWcfPage.CustomersWCF.Customer[] Customers = null;

在此示例中,AzureWcfPage 是我的自定义控件程序集。 CustomersWCF 是我为 WCF 服务引用提供的名称。 Customer 是我的 WCF 方法返回的类类型。 在我添加对自定义控件程序集的引用时,所有内容将流入新的 Web 部件中。

我进行的第一项检查是查看我的数据是否位于缓存中;如果是,则我只需将它转换为我以前存储在缓存中的 Customer 实例的数组。 如果不在缓存中,则只需编写创建自定义控件的实例并检索数据所需的七行代码。 您需要:

a. 创建控件的新实例

b. 设置 WcfUrl、MethodName、OutputType、ServerCacheName 和 ServerCacheTime 属性

c. 调用 ExecuteRequest 方法

就这么简单。 如果方法成功完成,则来自 WCF 应用程序的返回值将存储在 ASP.NET 缓存中,以便下次此代码执行时,它会在缓存中找到该项目。 同时,我可以将本地变量 Customers 转换为自定义控件的 QueryResultsObject 属性,然后可以执行 Web 部件需要对数据执行的任何操作。 总之,这对于大多数 Web 部件开发人员来说应比较简单和容易实现。

在任务中使用控件

现在我将介绍如何使用您在第 3 部分中开发的自定义控件从 Azure 中检索要在任务中使用的内容和/或配置数据。 在此示例中,我编写了一个自定义 SharePoint 计时器作业,我将在此作业中从 Azure 中检索一些数据。 该模式非常类似于上述 Web 部件,但在本例中,对于许多任务,您没有 HttpContext,因此无法使用 ASP.NET 缓存。 在此情况下,OutputType 将为 None,因为它无需呈现在页面中,并且无需存储在缓存中;我们将从 QueryResultsObject 和/或 QueryResultsString 中提取值目录。 下面是该操作的代码示例 – 此代码将重写我的自定义计时器作业类中的 Execute 方法:

SPWebApplication wa = (SPWebApplication)this.Parent;

//create an instance of the control

AzureWcfPage.WcfDataControl cfgCtrl = new AzureWcfPage.WcfDataControl();

//set the properties to retrieve data

cfgCtrl.WcfUrl = "https://azurewcf.vbtoys.com/Customers.svc";

cfgCtrl.OutputType = AzureConnect.WcfConfig.DataOutputType.None;

cfgCtrl.MethodName = "GetAllCustomers";

//since there's no Http context in a task like a timer job, you also need to

//provide the Url to a claims-enabled SharePoint site. That address will be used

//to connect to the STS endpoint for the SharePoint farm

cfgCtrl.SharePointClaimsSiteUrl = wa.Sites[0].RootWeb.Url;

//execute the method

bool success = cfgCtrl.ExecuteRequest();

//check for success

if (success)

{

//now retrieve the data and do whatever with it

       AzureWcfPage.CustomersWCF.Customer[] Customers =

(AzureWcfPage.CustomersWCF.Customer[])cfgCtrl.QueryResultsObject;

       string AzureResults = cfgCtrl.QueryResultsString;

//this is where you would then do your tasks based on the data you got from Azure

foreach(AzureWcfPage.CustomersWCF.Customer c in Customers)

       {

Debug.WriteLine(c.Email);

       }

       Debug.WriteLine(AzureResults);

}

else

{

//do something to log the fact that data wasn't retrieved

}

下面是对此代码的进一步的解释说明。 计时器作业是 Web 应用程序范围的作业,因此我首先通过引用 Parent 属性来获得对为其运行此作业的 SPWebApplication 的引用。 接下来,我创建在第 3 部分中编写的自定义控件并设置从 Azure 中检索数据所需的最少属性。 在下一行代码中,我必须设置 SharePointClaimsSiteUrl 属性。 正如我在第 3 部分中所述,当 CASI 工具包基类通过 ExecuteRequest 方法运行时,它会查看是否有可用的 HttpContext。 如果有,它会使用该上下文来确定当前 SharePoint 网站 Url 并通过该网站与 SharePoint STS 建立连接。 但正如我在上面所述,当您的代码在任务中运行时,通常没有 HttpContext。 在该情况下,基类无法确定应使用哪个 Url 连接到 SharePoint STS,因此在这种情况下,我们需要为它提供启用声明的 Web 应用程序中网站的 Url。 此实现中的计时器作业代码假定它将只在启用声明的 Web 应用程序上运行,因此这是我获得对当前 Web 应用程序的引用后只将其传递给第一个网站集的 Url 的原因。 使用哪个网站集其实并不重要,只要它位于启用声明的 Web 应用程序中即可。

在我设置了 SharePointClaimsSiteUrl 属性后,可以调用 ExecuteRequest 方法,如上所示。 如果它成功执行,则我可以通过 QueryResultsObject 和/或 QueryResultsString 属性直接从控件中提取数据。

Web 部件和计时器作业项目包括在附加到本文的 zip 文件中。

大功告成!

这是本系列中的最后一篇文章,希望您现在已很好地了解了 CASI 工具包以及如何可以使用它非常轻松地连接到网站或云中的 WCF 应用程序中承载的数据,同时能够跨应用程序和数据中心边界连接到用户的标识令牌。 总之,该模式比较容易实现:

1. 为您的内容和/或配置数据创建 WCF 前端。 为它启用声明并可选择将其移动到云中。 可选择根据调用用户的标识和声明实施细化权限决策。

2. 编写继承自 CASI 工具包基类的自定义控件。 重写某方法并编写五行代码。 将控件添加到简单布局页中并进行部署。

3. 将 Web 部件添加到页面中,设置一个或多个属性并开始呈现 WCF 数据。 可选择使用控件来检索自定义 Web 部件或任务(如自定义计时器作业)中的内容或配置数据。

就这些了。 希望 CASI 工具包可以消除将 SharePoint 场连接到存储在世界各地的数据时的许多困难和神秘。 它将同样可适用于检索配置或个性化数据以及要显示在 SharePoint 网站中的内容本身。 您现在可以灵活地跨应用程序和数据中心边界使用您在组织中实施的安全设置。 我在构想、设计和开发此工具包时感到很开心,希望您能够发现它很有用。 它仍是 v1 版本,我相信我们可以做得更好,所以随时欢迎为这些文章添加评论,我会定期浏览这些评论,将其作为思考酝酿下一个卓越版本的材料。

这是一篇本地化的博客文章。请访问 The Claims, Azure and SharePoint Integration Toolkit Part 5 以查看原文