前面過了一下Sharepoint的服務器端對象模型,接下來就讓我們大致看看Sharepoint的客戶端對象模型(Client Object Model: Client OM)。
首先需要了解的就是Sharepoint的客戶端模型是在Sharepoint2010才開始引入的,之前沒有這個概念。
一、為什么要引入客戶端對象模型呢?
這是因為隨着Sharepoint的推廣,人們發現有時需要從客戶端計算機或服務器遠程訪問Sharepoint網站和它的列表數據,這些客戶端計算機或服務器上並沒有安裝Sharepoint Fundation,也就是一個非常普通的環境,這樣的環境要訪問Sharepoint這樣一個特殊平台上的資源,如果沒有一種中間層作支持那是幾乎做不到的(當然,您可以使用 Web 服務與 SharePoint 列表和其他功能進行交互,但這並非易事。如果 Web 服務不提供必需的功能,您可以編寫服務器端代碼來提供新的 Web 服務,這是一項更為困難的任務。有些 IT 部門不允許使用服務器端代碼,或者只允許使用 IT 部門編寫的代碼,因此有時這並不可行)。所以,Sharepoint就引入了客戶端對象模型,基於此客戶端對象模型向開發者提供了相應的API來支持他們實現對遠程Sharepoint資源的訪問。其訪問的方式可以是客戶端計算機上的Windows應用程序、某個Silverlight 應用程序或Sharepoint的某個Custom Web Parts頁,如下圖所示:
客戶端對象模型的引入就解決了上圖中客戶端程序如何理解Sharepoint對象模型的問題,有了Sharepoint對象模型的理解,才有了針對這些Sharepoint對象的操作,即:您可以添加和刪除列表,添加、更新和刪除列表項,更改文檔庫中的文檔,創建網站,管理項目權限,以及在頁面中添加和刪除 Web 部件等等。
二、Sharepoint客戶端對象模型都有哪些,並都提供了哪些API呢?
Microsoft SharePoint 2010 軟件開發工具包 (SDK) 介紹了三種客戶端 API,這些 API 允許您通過在
1、瀏覽器中執行的腳本(ECMScript:Javascript,JScript)
2、在 .NET 托管應用程序中執行的代碼(Microsoft .NET Framework 3.5 或更高版本)
3、Microsoft Silverlight 2.0 應用程序
執行的代碼與 SharePoint 網站進行交互。
與上述三種API對應的分別是三種客戶端對象模型:
1、ECMAScript(JavaScript、JScript) 客戶端對象模型
2、.NET 托管客戶端對象模型
3、Silverlight 客戶端對象模型
上述三種客戶端對象模型均提供在 Microsoft.SharePoint.dll 中定義的服務器對象模型的子集,其中包括與 SharePoint Foundation 層次結構中的網站集(Site Collection)級別或更低級別的主要對象相對應的對象。為了提高安全性和性能,客戶端對象模型將重點放在與客戶端開發最為相關的 API 上,並且不包含在服務器對象模型中表示的所有類型和成員。
Sharepoin的這三類客戶端對象模型共享結構設計特征,例如對象模型層次結構、對象標識、數據檢索語義、客戶端上下文、基礎結構客戶端對象、集和異常處理。這些對象模型與 SharePoint Foundation 服務器對象模型一致,因此,如果您熟悉服務器端 API,則可以很快學會使用客戶端 .NET 托管 API、Silverlight API 或 JavaScript API。盡管客戶端對象模型與服務器對象模型並不是相似的,但它們自身之間通常是彼此相似的,因此,當您掌握服務器對象模型的一個子集之后,也就掌握了其他子集的大部分內容。只要有可能,新的對象模型就會借用 .NET Framework(尤其是 ADO.NET)中的異步范例。
注: Windows Phone 7不支持Sharepoint中Silverlight 客戶端對象模型
三、Sharepoint客戶端對象模型是怎么工作的呢?
上面的示意圖左邊是客戶端環境,右邊是Sharepoint服務器端環境。
客戶端環境運行的應用程序是通過客戶端對象模型提供的API來與Sharepoint的資源打交道的,它們有多種方式(Client OM)與 API 進行交互,這種交互涉及多方面的內容,比如:
.調用API提供的方法並獲取返回值
.傳遞協作應用程序標記語言 (CAML) 查詢並獲取結果
.設置或獲取屬性
使用 API 執行特定任務后,客戶端對象模型會將使用的這些 API 捆綁到 XML 並發送給運行 SharePoint Foundation 的服務器。也就是說發送給Sharepoint服務器的訪問請求是以XML格式傳遞的,因此上圖中表示為XML Request。
服務器在收到該請求(XML Request)后,會調用服務器上適當的對象模型(Server OM),收集響應,將響應組成 JavaScript 對象標注 (JSON),然后將 JSON 發送回 SharePoint Foundation 2010 托管客戶端對象模型。客戶端對象模型隨后分析 JSON 並將結果作為 .NET Framework 對象(或 JavaScript 的 JavaScript 對象)提供給應用程序。
所以,客戶端是以XML形式提交請求,服務器端是以JSON形式返回請求結果。客戶端應用程序是直接與客戶端對象模型打交道,服務器端是直接與服務器端對象模型打交道。
必須注意,您需要控制客戶端對象模型何時開始向服務器發送 XML 以及何時從服務器接收 JSON。
是否將對服務器的多次方法調用捆綁為單次調用由網絡速度、網絡延遲和所需的性能特性決定。如果客戶端對象模型在每次調用方法時都與服務器交互,系統性能將會降低,網絡流量會增大,從而導致系統不穩定。
您可以明確控制客戶端對象模型何時捆綁方法調用以及向服務器發送請求。在此過程中,在啟動與服務器的交互之前,您必須明確指定希望從服務器檢索哪些內容。這是客戶端對象模型與服務器端對象模型的最大區別。
四、客戶端應用程序是如何獲取客戶端對象模型的呢?
上圖說到客戶端應用程序通過客戶端對象模型與Sharepoint服務器端打交道,那么客戶端應用程序如何才擁有Sharepoint客戶端對象模型呢?
事實上,如果你的客戶端應用程序想要使用客戶端對象模型,您可獲取適當的 .dll 或 .js 文件的本地副本,因為Sharepoint的客戶端對象模型就是通過這些"代理 .js" 和"托管 .dll" 文件提供給客戶端應用程序的。
所以,Sharepoin的客戶端對象模型是分別通過代理 .js 和托管 .dll 文件提供出來的,你可在自定義應用程序(例如其他對象模型)中引用這些對象模型。這些對象模型作為 Windows Communication Foundation (WCF) 服務 (.../_vti_bin/client.svc) 來實現,但使用 Web 綁定來實現有效的請求批處理。所有操作實際上均為異步操作,命令被序列化到 XML 中,並通過一個 HTTP 請求發送到服務器。對於每個命令,會進行相應的服務器對象模型調用,並且服務器會向客戶端返回一個 JavaScript Object Notation(或 JSON)壓縮格式的響應,代理會分析此響應並將其與適當對象相關聯,這就是我們在上面敘述過的。
下面分情況來看如何獲取這些.dll 或 .js 文件的本地副本:
1、如果是開發基於.NET的應用程序
Microsoft SharePoint Foundation 2010 在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\ISAPI 中安裝了 Microsoft.SharePoint.Client.dll 和 Microsoft.SharePoint.Client.Runtime.dll.
若要使 你開發的Windows 窗體、Windows Presentation Foundation (WPF) 或其他調用 .NET 托管 SharePoint Foundation 客戶端 API 的應用程序能正常工作,則客戶端計算機必須已安裝 (引用)上述位置的SharePoint Foundation 客戶端 DLL ,你必須同時具有 Microsoft.SharePoint.Client.dll 和 Microsoft.SharePoint.Client.Runtime.dll 才能使用 .NET 托管對象模型遠程開發解決方案。也就是說:若要在客戶端計算機上使用包含 .NET 托管客戶端 API 的 DLL,必須使用 Microsoft 的 隨應用程序一起分發它們。
2、如果是開發Silverlight應用程序
對於 Silverlight 客戶端,Microsoft SharePoint Foundation 2010 將 Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll 部署到特殊的只限腳本的文件夾 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\ClientBin 中。此文件夾是用於承載在 Silverlight 中使用的程序集(此程序集包含在文件Microsoft.SharePoint.Client.xap中)的一個標准位置。必須同時具有 Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll 才能使用 Silverlight 對象模型遠程開發解決方案。
Silverlight 開發人員可以有兩種選擇:
一是將客戶端 DLL(Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll) 與你的Silverlight的 .xap 文件打包在一起以便下載。
另一個就是在運行時加載上面提到的Microsoft.SharePoint.Client.xap文件,因為這個文件中包含了客戶端 DLL(Microsoft.SharePoint.Client.Silverlight.dll 和 Microsoft.SharePoint.Client.Silverlight.Runtime.dll)。
Microsoft SharePoint Foundation 2010 支持在兩類上下文中實現 Silverlight 客戶端對象模型:Silverlight Web 部件和 Silverlight 跨域數據訪問系統(Silverlight 應用程序可通過此系統與 Microsoft SharePoint Foundation 2010 數據進行交互)。第三種可能的做法是修改服務器上的客戶端訪問跨域策略,但這將導致安全風險,因此 SharePoint Foundation 2010 中不支持此做法。
3、如果是開發基於ECMAScript的頁面應用
ECMAScript(JavaScript、JScript) 客戶端對象模型的縮小的 .js 文件(例如 SP.js、SP.Core.js、SP.Ribbon.js 和 SP.Runtime.js)安裝在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS 目錄下。當客戶端計算機瀏覽到使用標准 SharePoint Foundation 母版頁的任意 SharePoint Foundation 頁時,會將這些 .js 文件下載到客戶端。也就是說:包含 JavaScript 客戶端 API 的 .js 文件在標准 SharePoint Foundation 母版頁上引用,因此它們會自動下載到客戶端並支持客戶端使用其客戶端對象模型。
若要使用自定義母版頁,則在使用客戶端對象模型時,母版頁或內容頁必須引用這些 .js 文件。
SharePoint Foundation 還會在相同目錄下安裝未縮小的、調試版本的 .js 文件,如 SP.debug.js、SP.Core.debug.js、SP.Ribbon.debug.js 和 SP.Runtime.debug.js,並且您可以指定是否使用調試版。
SharePoint Foundation 中的默認母版頁在網頁中插入一個 ScriptManager 控件,並且默認將此控件的 ScriptMode 屬性設置為 Auto。通過將 <deployment retail="false" /> 添加到 web.config 文件(位於 %inetpub%\wwwroot\wss\VirtualDirectories\80 目錄中)的 system.web 節中,可以替代此默認設置並使用調試 .js 文件。
ECMAScript(JavaScript、JScript)對象模型是隨.NET 托管客戶端對象模型和 Silverlight 客戶端對象模型一起引入 Microsoft SharePoint Foundation 2010 中的。通過 JavaScript 對象模型,您無需在服務器上部署代碼即可使用對象。在部署沙盒解決方案或使用服務器功能區時,能夠在客戶端處理對象會非常有用。由於 JavaScript 的特性,所有代碼都異步執行並依賴回調函數來使用 SharePoint Foundation 2010 內的對象。JavaScript 只能處理當前上下文中的對象,即,無法進行跨站點腳本編寫,或訪問當前上下文外部的對象。
為了最大限度地減輕服務器的負荷,在創建對象時並不會加載所有對象屬性。您必須使用 Include 語句和 load(clientObject) (該鏈接可能指向英文頁面) 函數請求特定屬性。
JavaScript 不支持托管客戶端對象模型中的屬性。JavaScript 對象模型使用前面帶有 set_ 和 get_ 的方法,根據檢索或設置屬性的值的能力來公開相應屬性。
下面的列表顯示了在 /_layouts 文件夾中安裝的重要的調試 .js 文件:
- SP.debug.js
- SP.Core.debug.js
- SP.Ribbon.debug.js
- SP.Runtime.debug.js
- JsGrid.debug.js
- JsGrid.Gantt.debug.js
五、關於客戶端對象模型的命名空間:
Microsoft.SharePoint.Client 是用於 .NET 托管對象模型和 Silverlight 對象模型的核心命名空間,
SP是用於 ECMAScript(JavaScript、JScript) 對象模型的核心命名空間。
客戶端對象模型及其相應的集合對象繼承自 ClientObject (JavaScript: ClientObject) 和 ClientObjectCollection (JavaScript: ClientObjectCollection) 類。
除核心命名空間外,Microsoft SharePoint Foundation 2010 還提供以下命名空間:
下表顯示了Sharepoint客戶端對象模型的 API 為常見 SharePoint Foundation 2010 服務器對象提供的等效對象。
Sharepoint客戶端對象模型的 API不提供管理對象或范圍超出網站集(Site Collection)的對象,即服務器對象模型中的 SPSite 類。
六、關於作為中心對象的客戶端上下文(ClientContext)
在使用服務器端對象模型編程時我們都知道有一個SPContext對象,類似,Sharepoint的客戶端對象模型使用 ClientContext 對象作為所有操作的"引力中心"。
在獲取並使用網站和數據的過程中,首先將檢索上下文對象。例如,ClientContext clientContext = new ClientContext("http://MyServer/sites/MySiteCollection") 將實例化特定網站集的上下文對象。
ClientContext 對象 (JavaScript: ClientContext ) 將作為用於處理客戶端對象模型的主入口點,並作為在網站集中安排請求和啟動操作所借助的中央對象。使用 ClientContext 對象 (JavaScript: ClientContext) 的對象屬性可獲取網站集或網站(可通過其遠程訪問其他 SharePoint Foundation 客戶端對象)。
ClientContext() 構造函數 (JavaScript: ClientContext(serverRelativeUrl)) 基於指定的網站或網站集初始化客戶端上下文。在托管的客戶端對象模型中,此 URL 必須是特定網站的絕對 URL。在 ECMAScript(JavaScript、JScript) 對象模型中,要么使用服務器的相對 URL,要么不使用任何參數。在 JavaScript 中,如果使用未采用任何參數的構造函數,則目標網站的 URL 為包含該網頁的網站的 URL。
在實際執行查詢之前,可使用通過客戶端上下文返回的對象來定義要執行的操作。ClientContext 類 (JavaScript: ClientContext) 從 ClientRuntimeContext 類 (JavaScript: ClientRuntimeContext) 繼承 Load<T>(T, Expression<Func<T, Object>>[]) (JavaScript: load(clientObject)) 和 LoadQuery() (JavaScript: loadQuery(clientObjectCollection, exp)) 方法。定義一個查詢以執行特定操作並返回特定對象或屬性,然后調用其中的某個方法來加載此查詢。
在加載查詢后,調用 ClientContext 對象 (JavaScript: ClientContext) 的 ExecuteQuery() 或 ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) 方法 (JavaScript: executeQueryAsync(succeededCallback, failedCallback)) 以將查詢發送到服務器。Silverlight 客戶端對象模型提供一個 ExecuteQuery() 方法(可從不會修改用戶界面 (UI) 的線程同步調用此方法)和一個異步 ExecuteQueryAsync(ClientRequestSucceededEventHandler, ClientRequestFailedEventHandler) 方法(用於線程不會修改 UI 的情況)。這些用於執行查詢的方法將表述表示對客戶端執行的操作的 XML,並將此 XML 發送到服務器。在托管對象模型中,此調用是同步的,這表示在收到來自服務器的響應之前將組織代碼執行。此調用在 Silverlight 對象模型中可以是同步的或異步的,而在 JavaScript 對象模型中始終是異步的。在異步調用中,代碼將繼續執行而不會等待服務器響應。在 Silverlight 對象模型和 JavaScript 對象模型中,可以實現在收到服務器響應時調用的回調函數。
在 SharePoint Foundation Silverlight 和 JavaScript 對象模型中,可以使用客戶端上下文的 Current 屬性 (JavaScript: current) 從 SharePoint Foundation 中運行的頁面返回當前請求上下文。