宣告、Azure 與 SharePoint 整合工具組第 5 部分
宣告、Azure 與 SharePoint 整合工具組第 5 部分
這是 CASI (宣告、Azure 與 SharePoint 整合) 套件的第 5 部分 (共 5 個部分)。 第 1 部分: 是整個架構與解決方案的簡介,並說明此系列嘗試執行和涵蓋的內容。 第 2 部分: 包含建立 WCF 應用程式以及使其成為宣告感知,然後將它們移到 Windows Azure 的指示。 第 3 部分: 將新的自訂控制項新增至 _layouts 目錄中的網頁以逐步解說基礎類別,您將使用此基礎類別連接至含 Azure 資料的 SharePoint 網站。 第 4 部分: 列出 CASI 套件隨附的網頁組件並說明使用方式、不同的屬性為何等等。 在最後這篇文章中,我將逐步解說這個套件的另兩個核心案例,我會使用第 3 部分建立的自訂控制項擷取 Azure 資料,並將它儲存在 ASP.NET 快取中以和其他控制項搭配使用,並將它用於 SharePoint 工作。在此例中,我使用的是自訂 SharePoint 計時器工作。
使用其他網頁組件中的控制項
需要支援的其中一個核心現象是使用 CASI 套件架構擷取資料以在其他 SharePoint 網頁組件使用。 另外還有其他設計目標,就是「不」將例行的伺服器端呼叫傳送至潛在的遠端 WCF 端點。 為了進行和管理這兩個不同的需求,基礎類別會實作擷取資料支援,並將它直接儲存在 ASP.NET 快取中。 這可讓您開發其他自訂網頁組件,並遵循相當簡單的模式:
1. 查看您的資料是否在 ASP.NET 快取中。
a. 如果資料存在,請擷取它
b. 如果資料不存在:
i. 建立自訂控制項的執行個體
ii. 將 OutputType 設為 ServerCache,以及將 ServerCacheName 與 ServerCacheTime 設為適當值
iii. 呼叫 ExecuteRequest 方法並取得資料
首先,啟動新的 Visual Studio 專案 – 在此例中,我將採用 Visual Studio 2010,這樣我們才可以建立新的 SharePoint 2010 專案。 將專案設定為建立新的網頁組件,然後需要新增「兩個」參照 – 一個參照 CASI 套件基礎類別,一個參照您在第 3 部分所撰寫的自訂控制項。 請注意,如果您沒有新增 CASI 套件基礎類別的參照,則當您在控制項上使用和設定任何屬性時,Visual Studio 會在其下方加上紅色的曲線,告訴您找不到該屬性。 如果您看到這類錯誤,即表示您尚未新增 CASI 套件基礎類別的參照。
設定參照後,您可以撰寫適用於網頁組件的程式碼。 當您需要從 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
}
}
讓我們進一步探討部分的程式碼。 首先,請務必瞭解在新的網頁組件中,您「不需要」將服務參照新增至 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 方法傳回的類別類型。 當我新增參照到自訂控制項組件時,這一切全部都會傳入新的網頁組件中。
我所做的第一個檢查就是查看我的資料是否在快取中,如果資料存在,就會將它轉換成我之前儲存在 Customer 執行個體的陣列。 如果資料不在快取中,則只需要撰寫 7 行的程式碼即可建立自訂控制項執行個體並擷取資料。 您需要:
a. 建立新的控制項執行個體
b. 設定 WcfUrl、MethodName、OutputType、ServerCacheName 與 ServerCacheTime 屬性
c. 呼叫 ExecuteRequest 方法
就是這麼簡單。 如果方法成功完成,則從 WCF 應用程式傳回的值會儲存在 ASP.NET 快取中,因此下次此程式碼執行時,將在快取中找到項目。 另一方面,我可以將本機變數 Customers 轉換為自訂控制項的 QueryResultsObject 屬性,然後我就可以使用該資料執行我的網頁組件所需的動作。 整體而言,這對大部分的網頁組件開發人員來說是個相當簡單且易於實作的程式碼。
在工作中使用控制項
現在我將說明如何使用第 3 部分開發的自訂控制項,從 Azure 擷取要用於工作的內容和 (或) 設定資料。 在此範例中,我撰寫了一個自訂 SharePoint 計時器工作,我將從 Azure 擷取某些資料。 此模式非常類似於上述的網頁組件,但是在此例中,有許多工作都沒有 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 應用程式範圍的工作,因此我先取得 SPWebApplication 參照,這個作業將透過參照 Parent 屬性來執行。 接下來我會建立第 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 屬性直接從控制項取得我的資料。
網頁組件與計時器工作專案會包括在此文章所附加的 zip 檔案中。
完成!
這是本系列的最後一篇文章,希望您現在已充分地瞭解 CASI 套件,以及如何使用它來一方面連線至網站或雲端 WCF 應用程式所裝載的資料,另一方面又能夠連線至應用程式或甚至是資料中心界線間的使用者身分識別 Token。 總之,這個模式很容易實作:
1. 為您的內容和 (或) 設定資料建立 WCF 前端。 將它啟用宣告並選擇性地將它移到雲端。 (選擇性) 根據呼叫使用者的身分識別和宣告,選擇性地實作微調權限決策。
2. 撰寫繼承自 CASI 套件基礎類別的自訂控制項。 覆寫一個方法並撰寫 5 行的程式碼。 將控制項新增至簡單的版面配置頁面並加以部署。
3. 將網頁組件新增至網頁、設定一或多個屬性,並開始轉譯您的 WCF 資料。 您可以選擇性地使用控制項,在自訂網頁組件或是類似自訂計時器工作中擷取內容或設定資料。
大概就是這樣。 希望 CASI 套件可以讓您輕鬆地將 SharePoint 伺服器陣列連線到儲存在世界各地任何地方的資料。 不論在擷取設定資料或是個人化資料方面,或是在 SharePoint 網站中顯示的內容本身,您都可以使用此套件。 現在您可以在跨應用程式與資料中心界限間彈性地在組織中使用您所實作的安全性。 我在籌劃、設計和開發這個功能的過程中獲得了許多樂趣,而我希望這個功能對您會有些許的幫助。 如往常一樣,這是第 1 版,而我相信還有許多可以改進的地方,因此請不吝提供您的意見,我會定期查看以做為下一個主要版本的改善依據。
這是翻譯後的部落格文章。英文原文請參閱 The Claims, Azure and SharePoint Integration Toolkit Part 5