了解 SharePoint 2010 开发中的关键点
**摘要:**了解為 Microsoft SharePoint 2010 規(guī)劃和開(kāi)發(fā)業(yè)務(wù)解決方案時(shí)必須做出的關(guān)鍵點(diǎn)。
上次修改時(shí)間:?2012年3月13日
適用范圍:?Business Connectivity Services?| Office 2010?| Open XML?| SharePoint Designer 2010?| SharePoint Foundation 2010?| SharePoint Online?| SharePoint Server 2010?| Visual Studio
本文內(nèi)容
SharePoint 2010 設(shè)計(jì)決定概述
作為開(kāi)發(fā)平臺(tái)的 SharePoint 2010
將 SharePoint 解決方案包部署為服務(wù)器場(chǎng)解決方案與沙盒解決方案
使用 Web 部件、網(wǎng)站頁(yè)面或應(yīng)用程序頁(yè)面設(shè)計(jì) UI
SharePoint 2010 中的服務(wù)器對(duì)象模型與客戶端對(duì)象模型
訪問(wèn) SharePoint 網(wǎng)站中基于列表的內(nèi)容
在 ECMAScript 和 Silverlight 之間做出選擇
結(jié)論
其他資源
關(guān)于作者
供稿人:Ted Pattison(該鏈接可能指向英文頁(yè)面)?(SharePoint MVP),Critical Path Training(該鏈接可能指向英文頁(yè)面)?| 關(guān)于作者
目錄
-
SharePoint 2010 設(shè)計(jì)決定概述
-
作為開(kāi)發(fā)平臺(tái)的 SharePoint 2010
-
將 SharePoint 解決方案包部署為服務(wù)器場(chǎng)解決方案與沙盒解決方案
-
使用 Web 部件、網(wǎng)站頁(yè)面或應(yīng)用程序頁(yè)面設(shè)計(jì) UI
-
SharePoint 2010 中的服務(wù)器對(duì)象模型與客戶端對(duì)象模型
-
訪問(wèn) SharePoint 網(wǎng)站中基于列表的內(nèi)容
-
在 ECMAScript 和 Silverlight 之間做出選擇
-
結(jié)論
-
其他資源
-
關(guān)于作者
SharePoint 2010 設(shè)計(jì)選型概述
本文討論為 Microsoft SharePoint 2010 設(shè)計(jì)業(yè)務(wù)解決方案的架構(gòu)和開(kāi)發(fā)業(yè)務(wù)解決方案時(shí)必須做出的主要設(shè)計(jì)決定。您將了解何時(shí)應(yīng)該創(chuàng)建面向沙盒的 SharePoint 解決方案,以及何時(shí)創(chuàng)建僅支持服務(wù)器場(chǎng)級(jí)部署的 SharePoint 解決方案。本文還解釋構(gòu)建需要自定義用戶界面 (UI) 的 SharePoint 解決方案時(shí),如何在 Web 部件、網(wǎng)站頁(yè)面和應(yīng)用程序之間做出選擇。您還將了解如何在使用服務(wù)器端對(duì)象模型和客戶端對(duì)象模型之間做出決定,以及如何選擇適當(dāng)?shù)募夹g(shù)來(lái)訪問(wèn) SharePoint 列表中的內(nèi)容。
作為開(kāi)發(fā)平臺(tái)的 SharePoint 2010
SharePoint 技術(shù)的發(fā)展歷經(jīng)四個(gè)主要產(chǎn)品版本。2001 年的第一個(gè)版本和 2003 年的第二個(gè)版本得到了順利而適度的采用。不過(guò),從 2007 年的第三個(gè)版本開(kāi)始,SharePoint 技術(shù)得到了快速采用,真正開(kāi)始迅猛發(fā)展。全球數(shù)以千計(jì)的企業(yè)、組織和政府機(jī)構(gòu)已經(jīng)部署了 Microsoft Office SharePoint Server 2007。SharePoint 2010 通過(guò)引入新功能和服務(wù)在 2007 版本的基礎(chǔ)上進(jìn)行了改進(jìn),這給 SharePoint 技術(shù)的繼續(xù)發(fā)展帶來(lái)了美好的前景。
因?yàn)榻?jīng)過(guò)多年的發(fā)展,SharePoint 技術(shù)的受歡迎程度已經(jīng)提高,所以人們希望使用自定義 SharePoint 解決方案自定義內(nèi)置體驗(yàn)。而且,Microsoft 繼續(xù)在 SharePoint 技術(shù)上投資,力求將它轉(zhuǎn)變?yōu)橐涣鞯拈_(kāi)發(fā)平臺(tái)。在 2003 版本中,Microsoft 第一次實(shí)現(xiàn)了使用自定義 Microsoft .NET Framework 組件(如使用 C# 或 Microsoft Visual Basic 編寫的 Web 部件和事件處理程序)擴(kuò)展 SharePoint 網(wǎng)站。在 2007 版本中,Microsoft 通過(guò)引入面向開(kāi)發(fā)人員的基本構(gòu)建基塊(如內(nèi)容類型、網(wǎng)站欄、功能和解決方案包)將 SharePoint 更新為開(kāi)發(fā)平臺(tái)。
盡管 SharePoint 2010 的許多新方面改進(jìn)了 SharePoint 開(kāi)發(fā)人員平臺(tái),但是事實(shí)證明最重要的一個(gè)方面是稱為 Microsoft Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具的新工具集。Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具是一個(gè)很大的進(jìn)步,因?yàn)樗鼈冸[藏并自動(dòng)完成 SharePoint 開(kāi)發(fā)的許多繁瑣的方面,例如從 SharePoint 項(xiàng)目中的源文件生成解決方案包。通過(guò) Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具,還可以方便地將 SharePoint 項(xiàng)目的解決方案包部署到本地服務(wù)器場(chǎng),以便您可以在開(kāi)發(fā)工作站上測(cè)試和調(diào)試代碼。
Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具非常適合初學(xué)者和剛剛開(kāi)始 SharePoint 開(kāi)發(fā)的 .NET 開(kāi)發(fā)人員,因?yàn)樗顾麄兛梢钥焖俚厥炀氄莆招录夹g(shù)和提高工作效率。Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具還設(shè)計(jì)為具有可擴(kuò)展性,這使有經(jīng)驗(yàn)的 SharePoint 開(kāi)發(fā)人員可以使用工具集本身不直接支持的高級(jí)開(kāi)發(fā)技術(shù)。
除了 Visual Studio 2010 中新的支持,SharePoint 2010 開(kāi)發(fā)平臺(tái)還引入了一些其他改進(jìn)。例如,SharePoint 2010 允許您將解決方案包部署為服務(wù)器場(chǎng)解決方案或部署為沙盒解決方案。SharePoint 2010 引入了新客戶端對(duì)象模型,以補(bǔ)充自 2003 版本以來(lái)已成為 SharePoint 開(kāi)發(fā)平臺(tái)一部分的服務(wù)器端對(duì)象模型。SharePoint 2010 還引入了訪問(wèn) SharePoint 列表中的內(nèi)容的新選項(xiàng),包括 LINQ(語(yǔ)言集成查詢)支持和基于 REST 的 Web 服務(wù)。
具有不同的選項(xiàng)固然很好,但您任何時(shí)候都不可能使用所有這些選項(xiàng)。事實(shí)上,每次開(kāi)始為特定應(yīng)用場(chǎng)景設(shè)計(jì)新 SharePoint 解決方案時(shí),您都必須在這些選項(xiàng)之間做出選擇。下面各節(jié)介紹要考慮的關(guān)系最密切的設(shè)計(jì)問(wèn)題,以便您可以在設(shè)計(jì)和開(kāi)發(fā)新 SharePoint 解決方案時(shí)作出最佳選擇。
將 SharePoint 解決方案包部署為服務(wù)器場(chǎng)解決方案與沙盒解決方案
SharePoint 開(kāi)發(fā)中的一個(gè)基本概念是解決方案包。在物理級(jí)別,解決方案包是一個(gè) CAB 存檔,它包含在 SharePoint 環(huán)境中部署自定義開(kāi)發(fā)成果所需的文件和元數(shù)據(jù)。從設(shè)計(jì)的角度來(lái)看,解決方案包是用于重用、測(cè)試和部署的基本單位。解決方案包還提供可用于將更新推送到 SharePoint 場(chǎng)以修復(fù)錯(cuò)誤并擴(kuò)展已部署的解決方案的粒度。
在 SharePoint 2010 中可以通過(guò)兩種方式部署解決方案包:部署為服務(wù)器場(chǎng)解決方案或部署為沙盒解決方案。每次使用 Visual Studio 2010 中的 SharePoint 開(kāi)發(fā)工具創(chuàng)建新 SharePoint 項(xiàng)目時(shí),都會(huì)強(qiáng)制您選擇將代碼作為沙盒解決方案還是作為服務(wù)器場(chǎng)解決方案進(jìn)行開(kāi)發(fā)和測(cè)試。您的決定應(yīng)該基于是要開(kāi)發(fā)和測(cè)試 SharePoint 解決方案以僅支持服務(wù)器場(chǎng)級(jí)部署,還是要將它作為可以靈活地部署為服務(wù)器場(chǎng)解決方案或沙盒解決方案的 SharePoint 解決方案進(jìn)行測(cè)試。
部署為服務(wù)器場(chǎng)解決方案的解決方案包必須由服務(wù)器場(chǎng)管理員部署。因?yàn)榉?wù)器場(chǎng)解決方案部署需要將自定義文件復(fù)制到服務(wù)器場(chǎng)中的每個(gè) Web 服務(wù)器上,所以會(huì)對(duì)服務(wù)器場(chǎng)的運(yùn)行狀況帶來(lái)一定風(fēng)險(xiǎn)。此外,大多數(shù)服務(wù)器場(chǎng)解決方案在 Web 服務(wù)器上的全局程序集緩存中安裝自定義程序集 DLL,這允許內(nèi)部的代碼在完全信任級(jí)別運(yùn)行。因此,許多服務(wù)器場(chǎng)管理員要求對(duì) SharePoint 解決方案進(jìn)行冗長(zhǎng)的代碼檢查和嚴(yán)格的測(cè)試過(guò)程,然后再將其部署到生產(chǎn)場(chǎng)。有些 SharePoint 環(huán)境中的服務(wù)器場(chǎng)管理員要求更甚,完全禁止 SharePoint 解決方案的服務(wù)器場(chǎng)級(jí)部署。
SharePoint 2010 引入了新的沙盒體系結(jié)構(gòu),能提供有價(jià)值的服務(wù)器場(chǎng)級(jí)部署替代方法。與服務(wù)器場(chǎng)解決方案部署不同,沙盒解決方案部署不需要服務(wù)器場(chǎng)管理員的批準(zhǔn)或協(xié)助。相反,作為沙盒解決方案開(kāi)發(fā)的 SharePoint 解決方案可以由網(wǎng)站集所有者或網(wǎng)站管理員角色中的業(yè)務(wù)用戶上載和激活。這樣可大大加快自定義 SharePoint 解決方案投入使用的過(guò)程。通過(guò)沙盒解決方案還可以開(kāi)發(fā)面向不允許服務(wù)器場(chǎng)解決方案部署的環(huán)境(如 SharePoint Online)的自定義解決方案。
關(guān)于新沙盒體系結(jié)構(gòu),有一點(diǎn)非常重要但卻常被誤解。將 SharePoint 解決方案作為沙盒解決方案設(shè)計(jì)和開(kāi)發(fā)并不意味著必須始終將它部署為沙盒解決方案。相反,您可以將面向沙盒開(kāi)發(fā)的 SharePoint 解決方案部署為沙盒解決方案或部署為服務(wù)器場(chǎng)解決方案。這意味著將 SharePoint 解決方案作為沙盒解決方案開(kāi)發(fā)可以在各種部署方案中提供更大的靈活性。
我們來(lái)看一個(gè)沙盒解決方案如何提供這種靈活性的示例。在不允許服務(wù)器場(chǎng)級(jí)解決方案部署的 SharePoint 場(chǎng)中,具有網(wǎng)站管理員權(quán)限的用戶可在網(wǎng)站集上下文內(nèi)上載和激活 SharePoint 解決方案。在另一個(gè)沒(méi)有這些限制的 SharePoint 場(chǎng)中,相同的 SharePoint 解決方案可部署為服務(wù)器場(chǎng)解決方案,這樣就能獲得更高級(jí)別的性能和可維護(hù)性。這樣,當(dāng)沙盒的約束不會(huì)阻止您完成所需操作時(shí),您就會(huì)有面向沙盒的設(shè)計(jì)動(dòng)機(jī)。
沙盒解決方案的限制
決定是否應(yīng)該將 SharePoint 解決方案作為沙盒解決方案開(kāi)發(fā)時(shí),關(guān)鍵是了解沙盒中允許的操作和禁止的操作。例如,不允許沙盒解決方案將文件部署到 Web 服務(wù)器的文件系統(tǒng)。這意味著沙盒解決方案不能包含以下任一內(nèi)容:
-
安裝在全局程序集緩存中的程序集
-
在服務(wù)器場(chǎng)級(jí)別激活的功能
-
在 Web 應(yīng)用程序級(jí)別激活的功能
-
應(yīng)用程序頁(yè)面
-
用戶控件
-
可視 Web 部件
-
順序工作流模板
-
狀態(tài)機(jī)工作流模板
-
Business Data Connectivity (BDC) Service 模型
在可以使用服務(wù)器端代碼執(zhí)行的操作方面也有重要限制。盡管沙盒解決方案可以包含使用服務(wù)器端對(duì)象模型的代碼,但服務(wù)器端對(duì)象模型的許多部分仍被禁止使用。例如,沙盒解決方案中的代碼不能訪問(wèn)服務(wù)器端對(duì)象模型中當(dāng)前網(wǎng)站集范圍之外的任何內(nèi)容。不能使用 SPSite 類創(chuàng)建新對(duì)象以訪問(wèn)其他網(wǎng)站集。此外,不允許訪問(wèn)服務(wù)器端對(duì)象模型的服務(wù)器場(chǎng)級(jí)別的任何方面,如 SPFarm 對(duì)象或 SPWebApplication 對(duì)象。
以下列表顯示只有在服務(wù)器場(chǎng)解決方案中部署代碼時(shí)才能完成的常見(jiàn)編程任務(wù):
-
創(chuàng)建和配置 Web 應(yīng)用程序
-
創(chuàng)建和配置內(nèi)容數(shù)據(jù)庫(kù)
-
創(chuàng)建網(wǎng)站集
-
聚合存儲(chǔ)在兩個(gè)或更多網(wǎng)站集中的內(nèi)容
除了服務(wù)器端對(duì)象模型的編程限制,沙盒體系結(jié)構(gòu)還進(jìn)一步限制您使用 Microsoft .NET Framework 提供的許多類庫(kù)。SharePoint Foundation 通過(guò)在使用代碼訪問(wèn)安全性 (CAS) 設(shè)置初始化的獨(dú)立工作進(jìn)程中運(yùn)行沙盒代碼來(lái)強(qiáng)制實(shí)施這些限制。例如,不能訪問(wèn)?System.IO?命名空間中的任何類。此外,沙盒解決方案中的服務(wù)器端代碼不能訪問(wèn)允許您通過(guò)網(wǎng)絡(luò)訪問(wèn)資源的任何 .NET Framework 部分。這意味著您無(wú)法連接到數(shù)據(jù)庫(kù)、進(jìn)行出站 Web 服務(wù)調(diào)用,甚至無(wú)法發(fā)出簡(jiǎn)單的 HTTP GET 請(qǐng)求。
顯而易見(jiàn),沙盒對(duì)您可以在服務(wù)器端代碼中執(zhí)行的操作設(shè)置了重要限制。代碼可以訪問(wèn)內(nèi)容的唯一位置是在上載并激活沙盒解決方案的網(wǎng)站集中。這些限制可能會(huì)強(qiáng)制您在開(kāi)發(fā)需要通過(guò)網(wǎng)絡(luò)訪問(wèn)資源(如 Web 服務(wù)和數(shù)據(jù)庫(kù))的 SharePoint 項(xiàng)目時(shí)重新考慮您的設(shè)計(jì)。
在需要訪問(wèn)網(wǎng)絡(luò)資源的方案中,可能應(yīng)該選擇服務(wù)器場(chǎng)解決方案而不是沙盒解決方案。不過(guò),可以考慮另外一個(gè)選項(xiàng)。盡管沙盒解決方案體系結(jié)構(gòu)限制服務(wù)器端代碼可以執(zhí)行的操作,但是它不對(duì)客戶端代碼施加任何限制。因此,您可以使用在可以訪問(wèn)網(wǎng)絡(luò)資源的 ECMAScript(JavaScript、JScript)或 Microsoft Silverlight 應(yīng)用程序中編寫的客戶端代碼來(lái)設(shè)計(jì)沙盒解決方案。在本文中我們將繼續(xù)討論該設(shè)計(jì)選項(xiàng)。
?備注
Microsoft 使用術(shù)語(yǔ) JavaScript 而不是 JavaScript。有關(guān)詳細(xì)信息,請(qǐng)參閱下文中的 SharePoint 客戶端對(duì)象模型如何工作?一節(jié)。
沙盒解決方案的常見(jiàn)開(kāi)發(fā)應(yīng)用場(chǎng)景
對(duì)許多類型的 SharePoint 項(xiàng)目來(lái)說(shuō),對(duì)沙盒解決方案設(shè)置的限制通常過(guò)于嚴(yán)格。不過(guò),有一些簡(jiǎn)單業(yè)務(wù)解決方案類別完全可以使用沙盒解決方案實(shí)現(xiàn)。下面是使用沙盒解決方案可以滿足的要求列表:
-
創(chuàng)建自定義網(wǎng)站欄、內(nèi)容類型和列表定義
-
創(chuàng)建列表并添加用于數(shù)據(jù)驗(yàn)證的事件處理程序
-
在"快速啟動(dòng)"菜單和頂部導(dǎo)航欄上創(chuàng)建導(dǎo)航節(jié)點(diǎn)
-
添加查詢和更新列表的 Web 部件
-
添加網(wǎng)站頁(yè)面以托管 Web 部件和 Silverlight 應(yīng)用程序
-
使用自定義母版頁(yè)、CSS 文件和圖像確立 SharePoint 網(wǎng)站的品牌
使用 Web 部件、網(wǎng)站頁(yè)面或應(yīng)用程序頁(yè)面設(shè)計(jì) UI
在 SharePoint 項(xiàng)目中設(shè)計(jì) UI 時(shí)要考慮一些重要設(shè)計(jì)問(wèn)題。例如,是否應(yīng)該使用 Web 部件、網(wǎng)站頁(yè)面模板或應(yīng)用程序頁(yè)面創(chuàng)建 UI 元素?在用于創(chuàng)建自定義 UI 元素的這三種技術(shù)中,每種技術(shù)在特定應(yīng)用場(chǎng)景中都具有勝于其他兩種技術(shù)的優(yōu)勢(shì)。不過(guò),您可能會(huì)發(fā)現(xiàn)每種方法非常適用的其他方案,這意味著決定使用哪種方法完全取決于開(kāi)發(fā)人員的個(gè)人喜好。
認(rèn)真思考手頭的設(shè)計(jì)方案,并問(wèn)自己以下問(wèn)題:
-
是否需要支持用戶自定義和個(gè)性化?
-
是否擔(dān)心賦予用戶的控制權(quán)太多?
-
UI 是否需要用 C# 或 Visual Basic 編寫的服務(wù)器端代碼?
-
是否需要使用沙盒解決方案部署 UI?
支持網(wǎng)頁(yè)的用戶自定義
首先討論第一個(gè)問(wèn)題 — 是否需要支持用戶自定義和個(gè)性化。如果是,則最佳選擇是使用 Web 部件構(gòu)建 UI。這是因?yàn)?SharePoint Foundation 使用戶能夠添加、自定義、個(gè)性化和刪除 Web 部件。許多曾經(jīng)使用過(guò) SharePoint 技術(shù)的用戶非常擅于向頁(yè)面添加 Web 部件,并通過(guò)瀏覽器中的任務(wù)窗格自定義它們。
網(wǎng)站頁(yè)面也提供某種程度的用戶自定義支持,但是不如 Web 部件簡(jiǎn)單。例如,用戶不能使用瀏覽器自定義網(wǎng)站頁(yè)面的基礎(chǔ)內(nèi)容,而是必須依賴于與 SharePoint 兼容的頁(yè)面編輯工具,如 Microsoft SharePoint Designer 2010。不過(guò),您應(yīng)該知道,使用 SharePoint Designer 2010 修改網(wǎng)站頁(yè)面需要理解復(fù)雜的主題,如 HTML 編輯、服務(wù)器端控件和母版頁(yè)。因此,網(wǎng)站頁(yè)面自定義應(yīng)該僅限于涉及的高級(jí)用戶可以熟練使用 SharePoint Designer 2010 設(shè)計(jì) SharePoint 頁(yè)面的應(yīng)用場(chǎng)景。
如果您決定使用 Web 部件構(gòu)建 UI,則應(yīng)該考慮如何將這些 Web 部件添加到 SharePoint 網(wǎng)站中的頁(yè)面。最簡(jiǎn)單的方法只涉及創(chuàng)建 Web 部件,而不涉及任何其他操作。這是用戶需要向現(xiàn)有 Web 部件頁(yè)面添加 Web 部件實(shí)例的相當(dāng)常見(jiàn)的應(yīng)用場(chǎng)景。更完善的方法涉及在功能激活期間自動(dòng)完成向網(wǎng)站頁(yè)面添加 Web 部件的工作。
在 SharePoint 解決方案中創(chuàng)建 Web 部件時(shí),應(yīng)考慮是否需要另外創(chuàng)建頁(yè)面以托管 Web 部件。如果您認(rèn)為應(yīng)該這樣做,則不能使用應(yīng)用程序頁(yè)面,因?yàn)樗鼈儾恢С?Web 部件。而是必須設(shè)計(jì)一個(gè)或多個(gè)滿足 Web 部件頁(yè)面要求的網(wǎng)站頁(yè)面模板。創(chuàng)建網(wǎng)站頁(yè)面模板后,可以將它添加到 SharePoint 解決方案的模塊中,以便在功能激活期間創(chuàng)建新網(wǎng)站頁(yè)面實(shí)例。最后一步是使用 Web 部件實(shí)例預(yù)先填充網(wǎng)站頁(yè)面。為此,您可以在 File 元素內(nèi)部添加 AllUserWebPart 元素,這將在功能激活期間創(chuàng)建網(wǎng)站頁(yè)面。
控制 UI 自定義
現(xiàn)在,我們來(lái)考慮第二個(gè)問(wèn)題。您是否擔(dān)心賦予用戶的網(wǎng)站控制權(quán)太多?許多開(kāi)發(fā)人員害怕喜歡嘗試并且常常惹麻煩的粗心大意的用戶。例如,假定您的 UI 設(shè)計(jì)涉及具有 Web 部件的網(wǎng)站頁(yè)面。有什么方法可以防止特權(quán)用戶和被誤導(dǎo)的用戶將頁(yè)面置于編輯模式然后刪除 Web 部件?您可以想象這可能導(dǎo)致?lián)艽蛑С蛛娫?#xff0c;并且 SharePoint 網(wǎng)站在一段時(shí)間內(nèi)不可用,直到具有更多專業(yè)技能的人員介入,將適當(dāng)?shù)?Web 部件重新添加到頁(yè)面。
應(yīng)用程序頁(yè)面不支持任何形式的用戶自定義。因此,在希望鎖定 UI 的設(shè)計(jì)中使用它們可能非常有利。嘗試鎖定使用網(wǎng)站頁(yè)面和 Web 部件構(gòu)建的 UI 可能很繁瑣,在用戶具有網(wǎng)站所有者權(quán)限的應(yīng)用場(chǎng)景中通常不可行。
在 UI 后臺(tái)使用服務(wù)器端代碼
要考慮的下一問(wèn)題是是否要在 UI 后臺(tái)編寫服務(wù)器端代碼。如果要,則必須選擇 Web 部件或應(yīng)用程序頁(yè)面。更具體地說(shuō),應(yīng)該避免在網(wǎng)站頁(yè)面和網(wǎng)站頁(yè)面模板中編寫服務(wù)器端代碼。這是因?yàn)榫W(wǎng)站頁(yè)面必須支持安全模式處理,這會(huì)阻止用 C# 或 Visual Basic 編寫的內(nèi)嵌代碼。盡管從技術(shù)上講可以使用 C# 或 Visual Basic 創(chuàng)建自定義基類并在網(wǎng)站頁(yè)面模板中從此基類繼承,但是不建議使用這種方法。它可能非常麻煩,很少用于 SharePoint 開(kāi)發(fā),因?yàn)橄?Web 部件或在應(yīng)用程序頁(yè)面后臺(tái)添加服務(wù)器端代碼容易得多。
將 UI 部署為沙盒解決方案
設(shè)計(jì)自定義 UI 時(shí)要考慮的另一重要問(wèn)題是是否需要支持部署為沙盒解決方案。如果是,則必須避免使用不能由沙盒解決方案正確部署的應(yīng)用程序頁(yè)面。這意味著必須使用網(wǎng)站頁(yè)面和 Web 部件構(gòu)建 UI。
SharePoint 2010 中的服務(wù)器對(duì)象模型與客戶端對(duì)象模型
從 2003 版本開(kāi)始,SharePoint 向開(kāi)發(fā)人員提供了服務(wù)器端對(duì)象模型,以訪問(wèn)網(wǎng)站中的內(nèi)容和在網(wǎng)站級(jí)別執(zhí)行各種管理任務(wù),如創(chuàng)建列表、添加導(dǎo)航節(jié)點(diǎn)和配置權(quán)限。通過(guò)服務(wù)器端對(duì)象模型還可以在服務(wù)器場(chǎng)級(jí)別執(zhí)行管理任務(wù),如創(chuàng)建和配置 Web 應(yīng)用程序及內(nèi)容數(shù)據(jù)庫(kù)。
服務(wù)器端對(duì)象模型通過(guò)名為 Microsoft.SharePoint.dll 的程序集提供,該程序集部署在 SharePoint 場(chǎng)中的每個(gè)服務(wù)器上。這意味著開(kāi)發(fā)在 Web 服務(wù)器上運(yùn)行的 SharePoint 組件(如功能接收器、事件處理程序、Web 部件、應(yīng)用程序頁(yè)面和工作流模板)時(shí),可以使用服務(wù)器端對(duì)象模型。不過(guò),服務(wù)器端對(duì)象模型不能直接用于在不屬于 SharePoint 場(chǎng)的計(jì)算機(jī)上運(yùn)行的應(yīng)用程序和組件。
SharePoint 2010 引入了新客戶端對(duì)象模型,它允許通過(guò)網(wǎng)絡(luò)訪問(wèn) SharePoint 網(wǎng)站。例如,您可以使用客戶端對(duì)象模型在可以通過(guò)網(wǎng)絡(luò)連接到 SharePoint 網(wǎng)站的桌面應(yīng)用程序中編寫代碼。使用客戶端對(duì)象模型連接到 SharePoint 網(wǎng)站后,您可以讀取和更新列表和文檔庫(kù)中的內(nèi)容。還可以在網(wǎng)站中執(zhí)行管理任務(wù),如創(chuàng)建新列表、添加導(dǎo)航節(jié)點(diǎn)和配置用戶權(quán)限。
客戶端對(duì)象模型可以有效地用于多種類型的應(yīng)用程序。例如,通過(guò)客戶端對(duì)象模型,您可以使用 Windows Forms 和 Windows Presentation Foundation (WPF) 開(kāi)發(fā)在 SharePoint 網(wǎng)站中讀取和寫入內(nèi)容的桌面應(yīng)用程序。客戶端對(duì)象模型還非常適用于編寫在瀏覽器中的頁(yè)面后臺(tái)運(yùn)行的客戶端代碼,如自定義 JavaScript 代碼或 Silverlight 應(yīng)用程序。
使用客戶端對(duì)象模型的主要好處是它可以顯著改進(jìn)用戶體驗(yàn)。這是因?yàn)槟梢跃帉懺谟脩粲?jì)算機(jī)上執(zhí)行的代碼,這樣不再需要回發(fā)和混亂的頁(yè)面切換。例如,可以在命令按鈕后臺(tái)編寫客戶端代碼,以更新 SharePoint 網(wǎng)站中的列表項(xiàng),然后刷新 UI 以反映此更改。重要的是,在執(zhí)行這項(xiàng)工作時(shí),不會(huì)強(qiáng)制用戶忍受頁(yè)面切換或回發(fā)。
SharePoint 客戶端對(duì)象模型如何工作?
SharePoint 2010 中的客戶端對(duì)象模型基于 Windows Communication Foundation (WCF) 構(gòu)建,WCF 用于在客戶端計(jì)算機(jī)和 Web 服務(wù)器之間建立通信。SharePoint Foundation 使用名為 Client.svc 的 WCF Web 服務(wù)文件在服務(wù)器場(chǎng)中的每個(gè) Web 服務(wù)器上提供一個(gè)客戶端對(duì)象模型的入口點(diǎn)。
請(qǐng)注意,無(wú)需理解 WCF 的工作原理即可使用客戶端對(duì)象模型。實(shí)際上,客戶端對(duì)象模型專門設(shè)計(jì)用于對(duì) SharePoint 開(kāi)發(fā)人員隱藏 WCF 管道的基礎(chǔ)詳細(xì)信息。使用客戶端對(duì)象模型時(shí),您只需創(chuàng)建對(duì)象并訪問(wèn)它們的方法和屬性。客戶端對(duì)象模型提供客戶端運(yùn)行庫(kù),該運(yùn)行庫(kù)使用 WCF Web 服務(wù)調(diào)用處理與 Web 服務(wù)器的通信。
可以從三種類型的客戶端應(yīng)用程序訪問(wèn)客戶端對(duì)象模型,它們是 .NET Framework 應(yīng)用程序、Silverlight 應(yīng)用程序和在 SharePoint 網(wǎng)站中的頁(yè)面上運(yùn)行的 JavaScript 代碼。如果要開(kāi)發(fā) .NET Framework 應(yīng)用程序,則可以通過(guò)引用以下程序集訪問(wèn)客戶端對(duì)象模型:
-
Microsoft.SharePoint.Client.dll
-
Microsoft.SharePoint.Client.Runtime.dll
請(qǐng)注意,除使用客戶端對(duì)象模型的任何 .NET Framework 應(yīng)用程序外,還必須部署這兩個(gè)程序集。如果在運(yùn)行時(shí)不能加載這兩個(gè)程序集,則使用客戶端對(duì)象模型編寫的 .NET Framework 應(yīng)用程序?qū)o(wú)法正確運(yùn)行。
如果要開(kāi)發(fā) Silverlight 應(yīng)用程序,則可以通過(guò)引用以下程序集訪問(wèn)客戶端對(duì)象模型:
-
Microsoft.SharePoint.Client.Silverlight.dll
-
Microsoft.SharePoint.Client.Silverlight.Runtime.dll
請(qǐng)注意,每次 Silverlight 應(yīng)用程序開(kāi)始使用客戶端對(duì)象模型時(shí),這兩個(gè)程序集都必須可加載到瀏覽器的進(jìn)程中。不過(guò),部署這兩個(gè)程序集的步驟由 Visual Studio 2010 自動(dòng)處理。創(chuàng)建新 Silverlight 項(xiàng)目并添加對(duì)這兩個(gè)程序集的引用時(shí),Visual Studio 2010 會(huì)配置項(xiàng)目的生成過(guò)程以自動(dòng)將這兩個(gè)程序集嵌入用于部署 Silverlight 應(yīng)用程序的 .xap 文件中。這使您能夠隨依賴這些程序集的任何 Silverlight 應(yīng)用程序部署這些程序集。
現(xiàn)在該討論從自定義 ECMAScript(JavaScript、JScript)代碼使用客戶端對(duì)象模型了。首先要了解的是 Microsoft 使用術(shù)語(yǔ) JavaScript 而不是 JavaScript。例如,本文提到 JavaScript 客戶端對(duì)象模型。不要因?yàn)樾g(shù)語(yǔ) JavaScript 而感到困惑。它是可以與 JavaScript 互換使用的術(shù)語(yǔ)。
如果在 SharePoint 網(wǎng)站中的頁(yè)面上編寫客戶端 JavaScript 代碼,則可以通過(guò)名為 sp.js 的標(biāo)準(zhǔn)庫(kù)文件訪問(wèn) JavaScript 客戶端對(duì)象模型,該文件部署在服務(wù)器場(chǎng)中的每個(gè) Web 服務(wù)器上。在開(kāi)始使用 JavaScript 客戶端對(duì)象模型之前,必須確保 sp.js 已下載并且可供頁(yè)面使用。為此,您可以在 JavaScript 中調(diào)用 ExecuteOrDelayUntilScriptLoaded 方法并傳遞自定義函數(shù)名稱和 sp.js 的文件名。
復(fù)制
ExecuteOrDelayUntilScriptLoaded(MyEcmaScriptCode, "sp.js");function MyEcmaScriptCode() {// This code will not execute until sp.js is fully downloaded. }?備注
SharePoint 中的許多標(biāo)準(zhǔn) JavaScript 庫(kù)文件(如 sp.js)都配置為在頁(yè)面已顯示給用戶之后按需加載。這種新的延遲加載技術(shù)是在 SharePoint 2010 中引入的,以提供響應(yīng)速度更快的 UI 體驗(yàn)。不過(guò),開(kāi)發(fā)人員對(duì)延遲加載還存在顧慮。問(wèn)題在于,如果在文件尚未下載到瀏覽器時(shí)嘗試訪問(wèn) sp.js 中的任何內(nèi)容,則會(huì)遇到運(yùn)行時(shí)錯(cuò)誤。
對(duì) ExecuteOrDelayUntilScriptLoaded 的調(diào)用強(qiáng)制托管頁(yè)面在嘗試執(zhí)行自定義函數(shù)之前完全下載 sp.js。這是可用于確保客戶端 JavaScript 代碼可以成功調(diào)用 sp.js 并開(kāi)始使用客戶端對(duì)象模型的一種技術(shù)的示例。
異步執(zhí)行客戶端對(duì)象模型方法
開(kāi)始使用客戶端對(duì)象模型時(shí),您通常會(huì)發(fā)現(xiàn)不能使用同步行為對(duì) Web 服務(wù)器執(zhí)行方法。這是因?yàn)橥秸{(diào)用會(huì)占用主要 UI 線程,并導(dǎo)致凍結(jié) UI,直到方法調(diào)用返回。在應(yīng)用程序設(shè)計(jì)中,通過(guò)網(wǎng)絡(luò)進(jìn)行調(diào)用時(shí)凍結(jié) UI 通常無(wú)法讓人接受。因此,必須了解如何異步對(duì) Web 服務(wù)器執(zhí)行方法。
例如,開(kāi)發(fā)使用客戶端對(duì)象模型的 Silverlight 應(yīng)用程序時(shí),應(yīng)該始終使用 ExecuteQueryAsync 方法異步調(diào)用 Web 服務(wù)器。調(diào)用 ExecuteQueryAsync 方法時(shí),必須將委托引用傳遞給回調(diào)方法。這些回調(diào)方法在調(diào)用從 Web 服務(wù)器返回時(shí)執(zhí)行。以下代碼示例演示編寫為與 Web 服務(wù)器異步交互的簡(jiǎn)單 Silverlight 應(yīng)用程序。
C#復(fù)制
public partial class MainPage : UserControl {protected ClientContext clientContext;protected Web site;public MainPage() {InitializeComponent();clientContext = new ClientContext("http://intranet.wingtip.com");site = clientContext.Web;clientContext.Load(site);clientContext.ExecuteQueryAsync(OnSucceed, OnFail);}void OnSucceed(object sender, ClientRequestEventArgs args) {// Callback method that executes when there are no errors.}void OnFail(object sender, ClientRequestEventArgs args) {// Callback method that executes when there are errors.} }開(kāi)發(fā)人員面臨的另一難題涉及在回調(diào)方法中編寫用于處理線程切換的代碼。使用客戶端對(duì)象模型時(shí)需要這樣做,因?yàn)榛卣{(diào)方法在輔助線程上執(zhí)行,而輔助線程不能訪問(wèn) UI 中的控件,如文本框和數(shù)據(jù)網(wǎng)格。關(guān)鍵點(diǎn)在于開(kāi)發(fā)人員負(fù)責(zé)將執(zhí)行流從輔助線程切換回主 UI 線程。執(zhí)行流切換到主 UI 線程后,可以更新控件。下面的示例演示如何使用 Silverlight 應(yīng)用程序中的 Dispatcher.BeginInvoke 方法進(jìn)行線程切換以更新文本框控件。
C#復(fù)制
void OnSucceed(object sender, ClientRequestEventArgs args) {// Running on secondary thread.Dispatcher.BeginInvoke(delegate() {// Running on primary UI thread.txtDisplay.Text = "Site ID = " + site.Id.ToString();}); }從這些示例中您可能會(huì)發(fā)現(xiàn),使用客戶端對(duì)象模型需要高級(jí)編程技能。因此,使用客戶端對(duì)象模型開(kāi)發(fā)可能更適合高級(jí)開(kāi)發(fā)人員,而不是初學(xué)者。
訪問(wèn) SharePoint 網(wǎng)站中基于列表的內(nèi)容
SharePoint 2010 提供了用于訪問(wèn) SharePoint 網(wǎng)站中基于列表的內(nèi)容的多種不同選項(xiàng)。您可以在服務(wù)器端代碼中使用?SPQuery?對(duì)象或?SPSiteDataQuery?對(duì)象訪問(wèn)列表中的項(xiàng)。還可以決定使用新 LINQ to SharePoint 支持編寫查詢和更新列表項(xiàng)的服務(wù)器端代碼。說(shuō)到編寫客戶端代碼,客戶端對(duì)象模型和基于 REST 的新 Web 服務(wù)提供了另外兩個(gè)選項(xiàng)。本節(jié)介紹上述每種技術(shù),并討論它們的相對(duì)優(yōu)點(diǎn)和缺點(diǎn)。
在 2003 版本中,Microsoft 在服務(wù)器端對(duì)象模型中引入了 SPQuery 類,以提供一種查詢 SharePoint 列表中的項(xiàng)的途徑。使用 SPQuery 類要求開(kāi)發(fā)人員集中分析 XML 片段,以便采用稱為協(xié)作應(yīng)用程序標(biāo)記語(yǔ)言 (CAML) 的語(yǔ)言參數(shù)化查詢。下面是一個(gè)典型示例,演示使用 SPQuery 對(duì)象對(duì) SharePoint 列表執(zhí)行查詢需要執(zhí)行的操作。
C#復(fù)制
SPList contacts = this.Web.Lists["Contacts"]; SPQuery query = new SPQuery(); query.ViewFields = "<FieldRef Name='Title'/>" + "<FieldRef Name='FirstName'/>" +"<FieldRef Name='Email'/>" + query.Query = @"<Where><BeginsWith><FieldRef Name='FirstName'/><Value Type='Text'>B</Value></BeginsWith></Where><OrderBy><FieldRef Name='Title'/><FieldRef Name='FirstName'/> </OrderBy>";SPListItemCollection results = contacts.GetItems(query); foreach (SPListItem item in results) {// Enumerate through items.string FirstName = item["FirstName"].ToString() }SPQuery 類非常有用,因?yàn)樗峁┰诰帉懛?wù)器端代碼時(shí)對(duì)大型列表運(yùn)行查詢的有效方式。使用 SPQuery 對(duì)象的主要不利因素與開(kāi)發(fā)人員工作效率相關(guān)。Visual Studio 2010 在集中分析所需 CAML 片段方面不提供任何幫助。這通常導(dǎo)致開(kāi)發(fā)人員通過(guò)頻繁復(fù)制并粘貼工作示例中的 CAML 片段來(lái)重用技術(shù),這樣做效率很低。不過(guò),還存在以下問(wèn)題:對(duì)列值的訪問(wèn)未強(qiáng)類型化,而是必須通過(guò)以字符串形式傳遞列名稱來(lái)讀取和寫入列值。
string s = item["Title"].ToString()
缺少用于訪問(wèn)列表中的列值的強(qiáng)類型化技術(shù)產(chǎn)生了一些值得注意的不利因素。C# 編譯器和 Visual Basic 編譯器無(wú)法確定列名稱拼寫錯(cuò)誤的情況。編譯器還無(wú)法確定開(kāi)發(fā)人員是否已正確將列值轉(zhuǎn)換為正確的類型。這會(huì)導(dǎo)致只有在測(cè)試階段才能發(fā)現(xiàn)的錯(cuò)誤。缺少?gòu)?qiáng)類型化的列訪問(wèn)還導(dǎo)致在選擇要訪問(wèn)的列時(shí) Visual Studio 2010 無(wú)法通過(guò) IntelliSense 提供任何幫助。
在 2007 版本中,Microsoft 添加了 SPSiteDataQuery 類以補(bǔ)充 SPQuery 類。SPSiteDataQuery 類允許開(kāi)發(fā)人員執(zhí)行將多個(gè)列表中的項(xiàng)聚合到單個(gè)結(jié)果集中的查詢。例如,假定您要運(yùn)行單個(gè)查詢,該查詢可以查找并聚合當(dāng)前網(wǎng)站集中所有聯(lián)系人列表中的聯(lián)系人。您可以使用 SPSiteDataQuery 對(duì)象來(lái)運(yùn)行以下查詢,該對(duì)象將查詢范圍設(shè)置為當(dāng)前網(wǎng)站集并提供基于 Contact 內(nèi)容類型的 where 子句。
C#復(fù)制
SPSiteDataQuery query = new SPSiteDataQuery(); query.Webs = "<Webs Scope='SiteCollection' />"; query.ViewFields = "<FieldRef Name='Title'/>" + "<FieldRef Name='FirstName'/>" +"<FieldRef Name='Email'/>"; query.Query = @"<Where><FieldRef Name='ContentType'/><Value Type='Computed'>Contact</Value></Where>"; DataTable results = this.Web.GetSiteData(query); foreach (DataRow item in results.Rows) {// Enumerate through items.string FirstName = item["FirstName"].ToString() }能夠運(yùn)行聚合多個(gè)列表中的項(xiàng)的查詢毫無(wú)疑問(wèn)使 SPSiteDataQuery 具備了優(yōu)于其他列表訪問(wèn)技術(shù)的獨(dú)特功能。因此,在需要聚合的應(yīng)用場(chǎng)景中,它對(duì) SharePoint 開(kāi)發(fā)人員非常有用。不過(guò),SPSiteDataQuery 類與 SPQuery 類一樣,都會(huì)對(duì)開(kāi)發(fā)人員的工作效率產(chǎn)生不利影響,因?yàn)樗鼜?qiáng)制開(kāi)發(fā)人員集中分析 CAML 片段,并且它不提供對(duì)列值的強(qiáng)類型化訪問(wèn)。
SPSiteDataQuery 類的另一個(gè)潛在問(wèn)題是它可能導(dǎo)致效率很低的查詢,這類查詢花費(fèi)很長(zhǎng)時(shí)間運(yùn)行并且消耗 Web 服務(wù)器的大量處理周期。因此,在使用 SPSiteDataQuery 類時(shí),應(yīng)確保充分執(zhí)行性能測(cè)試。還應(yīng)該考慮避免在訪問(wèn)頻率較高的頁(yè)面(如網(wǎng)站的主頁(yè))的后臺(tái)使用 SPSiteDataQuery 類。
使用 LINQ to SharePoint 提供程序支持
Microsoft 在 SharePoint 2010 中引入了一項(xiàng)支持,該支持允許服務(wù)器端代碼使用 LINQ(語(yǔ)言集成查詢)針對(duì) SharePoint 列表執(zhí)行查詢。該支持由作為 SharePoint Foundation 中的標(biāo)準(zhǔn)組件安裝的 LINQ to SharePoint 提供程序?qū)崿F(xiàn)。
使用 LINQ to SharePoint 提供程序訪問(wèn) SharePoint 列表中的項(xiàng)的主要優(yōu)勢(shì)是提高了開(kāi)發(fā)人員的工作效率。使用 LINQ 訪問(wèn) SharePoint 列表時(shí),無(wú)需使用 CAML。相反,您可以直接使用 C# 或 Visual Basic 編寫 where 子句和 order by 子句。
通過(guò)使用 LINQ,還能夠以強(qiáng)類型化的方式針對(duì)列值進(jìn)行編程。這允許編譯器在開(kāi)發(fā)人員出現(xiàn)列名稱或列類型錯(cuò)誤時(shí)生成錯(cuò)誤。LINQ 的強(qiáng)類型化特性還使 Visual Studio 2010 可以向 IntelliSense 提供一個(gè)下拉列表,以列表形式顯示所有可用列。
檢查編寫為針對(duì) SharePoint 列表執(zhí)行 LINQ 查詢的以下代碼,并將它與前面所示的使用 CAML 的示例進(jìn)行比較。
C#復(fù)制
WingtipSiteDataContext dc = new WingtipSiteDataContext(this.Web.Url); var query = from contact in dc.Contactswhere contact.FirstName.StartsWith("B")orderby contact.LastNameselect contact; foreach (var item in query) {// Enumerate through items.string FirstName = item.FirstName; }LINQ to SharePoint 提供程序還可以在向 SharePoint 列表添加新項(xiàng)時(shí)提高開(kāi)發(fā)人員的工作效率。與查詢列表項(xiàng)時(shí)一樣,LINQ to SharePoint 提供程序在您向新列表項(xiàng)分配列值時(shí)啟用強(qiáng)類型化和 IntelliSense。下面是使用 LINQ 支持添加新列表項(xiàng)的一個(gè)示例。
C#復(fù)制
WingtipSiteDataContext dc = new WingtipSiteDataContext(this.Web.Url); Contact newContact =new Contact {FirstName = "Wendy",LastName = "Wheeler"EMail = "wendy@wheeler.com"}; dc.Contacts.InsertOnSubmit(newContact); dc.SubmitChanges();顯而易見(jiàn),LINQ to SharePoint 提供程序向需要查詢和更新 SharePoint 列表項(xiàng)的開(kāi)發(fā)人員提供了明確的好處。不過(guò),您應(yīng)該了解 LINQ to SharePoint 提供程序?qū)嶋H上只表示 CAML 上的生產(chǎn)效率層。在后臺(tái),LINQ to SharePoint 提供程序?qū)?LINQ 查詢語(yǔ)句轉(zhuǎn)換為 CAML 然后使用 CAML 對(duì)內(nèi)容數(shù)據(jù)庫(kù)執(zhí)行這些查詢。因此,結(jié)合使用 CAML 和 SPQuery 類或 SPSiteDataQuery 類無(wú)法完成的操作實(shí)際上使用 LINQ to SharePoint 提供程序也無(wú)法完成。不過(guò),反過(guò)來(lái)說(shuō)則不盡然。使用 LINQ 無(wú)法完成的一些操作可以使用 SPQuery 類和 SPSiteDataQuery 類來(lái)完成。
使用 LINQ to SharePoint 提供程序的一個(gè)問(wèn)題是您必須提前了解列的情況。在編寫使用 LINQ to SharePoint 提供程序的代碼之前,必須首先運(yùn)行 spmetal.exe 實(shí)用工具以生成 LINQ 編程中所需的實(shí)體類。這導(dǎo)致在代碼必須在運(yùn)行時(shí)發(fā)現(xiàn)列表中的列名稱和類型的應(yīng)用場(chǎng)景中,無(wú)法使用 LINQ。
另一個(gè)問(wèn)題是 LINQ to SharePoint 提供程序不支持與 SPSiteDataQuery 類及其功能(運(yùn)行將網(wǎng)站集中多個(gè)列表中的項(xiàng)聚合在一起的查詢)相匹配的任何行為。相反,必須使用 LINQ to SharePoint 提供程序運(yùn)行多個(gè)查詢,然后編寫您自己的代碼將結(jié)果聚合在單個(gè)結(jié)果集中。
有關(guān) LINQ to SharePoint 提供程序的最后一點(diǎn)說(shuō)明是目前它不提供禁用限制的方法。這意味著使用 LINQ to SharePoint 提供程序執(zhí)行的查詢面臨以下風(fēng)險(xiǎn):返回的項(xiàng)數(shù)超過(guò)當(dāng)前 Web 應(yīng)用程序的限制閾值時(shí)失敗。使用 SPQuery 類或 SPSiteDataQuery 類執(zhí)行查詢時(shí)無(wú)限制,因?yàn)槟梢酝ㄟ^(guò)將 QueryThrottleMode 屬性設(shè)置為值 Override 來(lái)禁用限制。
C#復(fù)制
SPQuery query = new SPQuery(); query.QueryThrottleMode = SPQueryThrottleOption.Override;現(xiàn)在我們已經(jīng)介紹了用于通過(guò)服務(wù)器端代碼訪問(wèn) SharePoint 列表的技術(shù)。不過(guò),某些 SharePoint 設(shè)計(jì)方案更適合使用客戶端代碼而不是服務(wù)器端代碼。因此,您還應(yīng)該了解用于通過(guò)網(wǎng)絡(luò)查詢 SharePoint 列表項(xiàng)的選項(xiàng)有哪些。一個(gè)選項(xiàng)是使用客戶端對(duì)象模型訪問(wèn) SharePoint 列表。另一選項(xiàng)是使用 SharePoint Foundation 附帶的基于 REST 的新 Web 服務(wù)。下一節(jié)將分析這兩種技術(shù),以便將它們與您剛剛了解的服務(wù)器端技術(shù)相比較。
使用 SharePoint 客戶端對(duì)象模型訪問(wèn)列表項(xiàng)
客戶端對(duì)象模型為可以在網(wǎng)站集中完成的操作提供了各種功能。例如,您可以使用客戶端對(duì)象模型編寫用于添加用戶、創(chuàng)建列表和配置權(quán)限的代碼。除了這種類型的功能,客戶端對(duì)象模型還提供讀取和寫入列表項(xiàng)的功能。
對(duì)查詢列表項(xiàng)的客戶端對(duì)象模型支持通過(guò) CamlQuery 類實(shí)現(xiàn)。顧名思義,使用 CamlQuery 運(yùn)行查詢需要您依照 CAML 工作,如以下示例所示。
C#復(fù)制
clientContext = new ClientContext("http://intranet.wingtip.com"); site = clientContext.Web; clientContext.Load(site); List contactsList = site.Lists.GetByTitle("Contacts"); clientContext.Load(contactsList); CamlQuery query = new CamlQuery(); query.ViewXml = @"<View><Query><FieldRef Name='Title' /><FieldRef Name='FirstName'/><FieldRef Name='Email'/><Where><BeginsWith><FieldRef Name='FirstName'/><Value Type='Text'>B</Value></BeginsWith></Where></Query></View>"; ListItemCollection contactsCollection; contactsCollection = contactsList.GetItems(customersQuery); clientContext.Load(contactsCollection); clientContext.ExecuteQueryAsync(OnSucceed, OnFail);使用客戶端對(duì)象模型查詢和更新列表項(xiàng)具有與使用 SPQuery 類和 SPSiteDataQuery 類相同的一些不利因素。即,您需要集中分析 CAML 片段。這意味著編譯器無(wú)法捕獲 CAML 片段中的任何錯(cuò)誤。此外,編寫查詢時(shí)不能獲得任何 IntelliSense 幫助。
使用基于 REST 的 Web 服務(wù)訪問(wèn) SharePoint 列表項(xiàng)
用于查詢和更新列表項(xiàng)的最后一種技術(shù)涉及使用 SharePoint Foundation 中內(nèi)置的基于 REST 的新 Web 服務(wù)。基于 REST 的這一 Web 服務(wù)使用名為 ListData.svc 的 WCF Web 服務(wù)文件公開(kāi),該文件可通過(guò) _vti_bin 目錄訪問(wèn)。通過(guò) ListData.svc,可以基于在末尾包含列表標(biāo)題的相對(duì)于網(wǎng)站的 URL,使用簡(jiǎn)單的 HTTP GET 請(qǐng)求訪問(wèn) SharePoint 列表中的項(xiàng),如以下示例所示。
http://intranet.wingtip.com/\_vti\_bin/ListData.svc/Contac
使用基于 REST 的 Web 服務(wù)的一個(gè)好處是它可以從幾乎任意類型的客戶端(包括瀏覽器)訪問(wèn)。另一相關(guān)好處是任何命令都可以通過(guò)追加查詢字符串參數(shù)化為目標(biāo) URL。創(chuàng)建 URL 以通過(guò) ListData.svc 訪問(wèn)列表項(xiàng)時(shí),可以添加 QueryString 參數(shù)以選擇字段并控制篩選和排序,如以下示例所示。
ListData.svc/Contacts()?$select=FirstName,LastName
ListData.svc/Contacts()?$filter=startswith(FirstName, 'B')
ListData.svc/Contacts()?$orderby=FirstName
使用 ListData.svc 的另一重要好處是它會(huì)生成符合新出現(xiàn)的 Web 協(xié)議(如 Atom 發(fā)布協(xié)議 (AtomPub) 和開(kāi)放式數(shù)據(jù)協(xié)議 (OData))的 XML 響應(yīng)。將 OData 標(biāo)準(zhǔn)化為客戶端和 Web 服務(wù)之間的協(xié)議在 Microsoft 內(nèi)和整個(gè)行業(yè)中越來(lái)越常用。它的普遍應(yīng)用是因?yàn)樗軌蛱峁┮环N簡(jiǎn)單的標(biāo)準(zhǔn)化方式來(lái)公開(kāi)和訪問(wèn)各種數(shù)據(jù)源(如關(guān)系數(shù)據(jù)庫(kù)、文件系統(tǒng)、標(biāo)準(zhǔn)網(wǎng)站以及現(xiàn)在的 SharePoint 列表)中的內(nèi)容。
SharePoint 團(tuán)隊(duì)使用 WCF Data Services 實(shí)現(xiàn)基于 REST 的 Web 服務(wù),這一點(diǎn)也非常重要。SharePoint 與 WCF Data Services 的集成帶來(lái)了新的好處,因?yàn)樗鼓軌蚴褂?LINQ 查詢語(yǔ)句檢索 SharePoint 列表項(xiàng)。此外,它還允許您使用強(qiáng)類型化屬性訪問(wèn)列值。這會(huì)產(chǎn)生類似于使用 LINQ to SharePoint 提供程序的開(kāi)發(fā)人員體驗(yàn),因?yàn)榫幾g器和 IntelliSense 在您編寫查詢時(shí)可提供額外的幫助。
若要在 Visual Studio 2010 項(xiàng)目中創(chuàng)建服務(wù)引用,您必須傳遞指向 ListData.svc 的相對(duì)于網(wǎng)站的 URL。當(dāng) Visual Studio 2010 從 ListData.svc 創(chuàng)建服務(wù)引用時(shí),它會(huì)生成包含網(wǎng)站的數(shù)據(jù)上下文類和每個(gè)列表的 LINQ 兼容實(shí)體類的代碼。數(shù)據(jù)上下文類基于 DataServiceQuery 類為每個(gè)列表公開(kāi)一個(gè)屬性,這樣您就可以使用 LINQ 查詢語(yǔ)句執(zhí)行遠(yuǎn)程查詢,如以下示例所示。
C#復(fù)制
String url = "http://intranet.wingtip.com/_vti_bin/ListData.svc"; WingtipSiteDataContext dc = new WingtipSiteDataContext(new Uri(url)); var query = from contact in dc.Contactswhere contact.FirstName.StartsWith("B")select contact; foreach (var item in query) {// Strongly typed access to column value.string FirstName = item.FirstName; }如果計(jì)劃從 JavaScript 代碼或在瀏覽器中運(yùn)行的 Silverlight 應(yīng)用程序調(diào)用 ListDava.svc,則還必須了解如何異步執(zhí)行查詢。下面是 Silverlight 應(yīng)用程序的一個(gè)示例,該應(yīng)用程序使用針對(duì) ListDava.svc 創(chuàng)建的服務(wù)引用異步執(zhí)行遠(yuǎn)程查詢。
C#復(fù)制
public partial class MainPage : UserControl {String url = "http://intranet.wingtip.com/_vti_bin/ListData.svc";protected WingtipSiteDataContext dataContext;protected DataServiceQuery<ContactsItem> ContactsQuery;public MainPage() {InitializeComponent();dataContext = new WingtipSiteDataContext(new Uri(url)); ContactsQuery = (from contact in dataContext.Contactswhere contact.FirstName.StartsWith("B")select contact) as DataServiceQuery<ContactsItem>;ContactsQuery.BeginExecute(DisplayContacts, null);}public void DisplayContacts(IAsyncResult result) {Dispatcher.BeginInvoke(delegate(){var queryResults = ContactsQuery.EndExecute(result);foreach (var contact in queryResults) {// Access columns using strongly typed properties.string FirstName = customer.FirstName;} });} }請(qǐng)注意,以下示例實(shí)現(xiàn)了 DisplayContacts 回調(diào)方法,以使用前面討論的 Dispatcher.BeginInvoke 方法執(zhí)行線程切換。針對(duì) ListData.svc 異步執(zhí)行查詢類似于使用客戶端對(duì)象模型,因?yàn)槟仨氃诟?UI 中的任何控件之前將回調(diào)方法的執(zhí)行切換回主線程。
在 ECMAScript 和 Silverlight 之間做出選擇
在現(xiàn)代 Web 應(yīng)用程序設(shè)計(jì)中,添加客戶端代碼的要求越來(lái)越普遍。畢竟,具有豐富客戶端行為的網(wǎng)站現(xiàn)在已經(jīng)成為 Internet 上的標(biāo)準(zhǔn)。向 SharePoint 解決方案添加客戶端代碼無(wú)疑是改進(jìn)用戶體驗(yàn)的一種方法。
除了改進(jìn)用戶體驗(yàn)之外,在一些 SharePoint 設(shè)計(jì)方案中,客戶端代碼還可以執(zhí)行服務(wù)器端代碼無(wú)法執(zhí)行的操作。我們來(lái)分析一個(gè)簡(jiǎn)單的示例。假定您需要開(kāi)發(fā)一個(gè)沙盒解決方案,以便從 Internet 上的公共 Web 服務(wù)檢索內(nèi)容,然后將這些內(nèi)容寫入 SharePoint 列表。在沙盒解決方案中使用服務(wù)器端代碼存在的問(wèn)題是無(wú)法調(diào)用 Web 服務(wù)。
不過(guò),您可以重新設(shè)計(jì)沙盒解決方案以包含直接從用戶瀏覽器調(diào)用 Web 服務(wù)的自定義 JavaScript 代碼或 Silverlight 應(yīng)用程序。客戶端代碼從 Web 服務(wù)檢索內(nèi)容后,即可使用客戶端對(duì)象模型或 ListData.svc 將這些內(nèi)容寫入 SharePoint 列表。本例還提供了為什么可能要在 SharePoint 解決方案中包含客戶端代碼的另一動(dòng)機(jī)。
如果您決定向 SharePoint 解決方案添加客戶端代碼,則下一步是選擇在頁(yè)面后臺(tái)編寫自定義 JavaScript 代碼,或者開(kāi)發(fā)一個(gè)或多個(gè) Silverlight 應(yīng)用程序。我們來(lái)看一下每種方法的利弊。
JavaScript 具有適用范圍大于 Silverlight 的優(yōu)勢(shì),因?yàn)樗诟酁g覽器中受支持。此外,瀏覽器包含對(duì) JavaScript 的內(nèi)置支持,而在用戶下載并安裝 Silverlight 運(yùn)行庫(kù)之前 Silverlight 應(yīng)用程序無(wú)法運(yùn)行。盡管下載并安裝 Silverlight 運(yùn)行庫(kù)可以通過(guò) Internet 在幾秒鐘內(nèi)完成,您仍然必須承認(rèn),Silverlight 開(kāi)發(fā)假定用戶將信任 Microsoft 軟件組件并通過(guò) Internet 進(jìn)行安裝。在覆蓋范圍很廣的方案中做出這種假設(shè)可能不合適,例如在開(kāi)發(fā)面向 Internet 的商用應(yīng)用程序時(shí),此時(shí)您希望覆蓋最大數(shù)量的潛在用戶。
在大多數(shù) SharePoint 2010 環(huán)境中,通常可以假定隨 SharePoint 解決方案部署 Silverlight 應(yīng)用程序不會(huì)導(dǎo)致問(wèn)題。畢竟,SharePoint Foundation 在標(biāo)準(zhǔn)頁(yè)面(例如,通過(guò)選擇"網(wǎng)站操作"菜單上的"其他選項(xiàng)"命令獲得的創(chuàng)建頁(yè)面)中包含一些不同的 Silverlight 3 應(yīng)用程序。
SharePoint 2010 用戶需要安裝 Silverlight 3 才能獲得完整內(nèi)置體驗(yàn)這一事實(shí)意味著,通常可以假定他們已在計(jì)算機(jī)上安裝 Silverlight 3 運(yùn)行庫(kù)。如果計(jì)劃使用 Silverlight 4 而不是 Silverlight 3,則必須假定用戶愿意并且能夠在計(jì)算機(jī)上安裝 Silverlight 的更新版本。
在 JavaScript 和 Silverlight 之間做出選擇時(shí)要考慮的最后一點(diǎn)與開(kāi)發(fā)人員工作效率相關(guān)。在這一方面,Silverlight 開(kāi)發(fā)明顯更勝一籌。這是因?yàn)槟梢栽?Visual Studio 2010 中工作并使用 C# 或 Visual Basic 編寫代碼。調(diào)用 .NET Framework 和客戶端對(duì)象模型中的方法時(shí),您可以體驗(yàn)編譯時(shí)類型檢查和 IntelliSense 的所有好處。還可以創(chuàng)建服務(wù)引用,從而大大簡(jiǎn)化針對(duì) Web 服務(wù)(如 ListData.svc)進(jìn)行編程。
在 Visual Studio 2010 中對(duì) JavaScript 進(jìn)行編程的體驗(yàn)與對(duì) Silverlight 應(yīng)用程序進(jìn)行編程的體驗(yàn)完全不同。沒(méi)有編譯時(shí)類型檢查,針對(duì)客戶端對(duì)象模型進(jìn)行編程時(shí)也沒(méi)有任何 IntelliSense。此外,還需要掌握 JavaScript 和 ASP.NET AJAX 的高級(jí)編程技能,才能調(diào)用 Web 服務(wù)(如 ListData.svc)或者在更新 UI 中的內(nèi)容之前從回調(diào)方法執(zhí)行所需的線程切換。如果您剛剛開(kāi)始學(xué)習(xí)編寫客戶端代碼,則與使用 JavaScript 編寫代碼相比,使用 Silverlight 開(kāi)發(fā)是更好的選擇。
結(jié)論
本文討論了 SharePoint 2010 開(kāi)發(fā)中的主要設(shè)計(jì)決定。您了解了為什么以及什么時(shí)候應(yīng)該面向沙盒,以及什么時(shí)候應(yīng)該創(chuàng)建需要服務(wù)器場(chǎng)級(jí)部署的 SharePoint 解決方案。您還了解了決定使用 Web 部件、網(wǎng)站頁(yè)面和應(yīng)用程序構(gòu)建自定義 UI 時(shí)要考慮的問(wèn)題。
本文還討論了使用服務(wù)器端對(duì)象模型和客戶端對(duì)象模型的不同應(yīng)用場(chǎng)景。您可以看出這實(shí)際上取決于特定應(yīng)用場(chǎng)景的細(xì)節(jié)以及應(yīng)用場(chǎng)景是否需要客戶端代碼。您還了解了,針對(duì) SharePoint 對(duì)象進(jìn)行編程和查詢列表時(shí),服務(wù)器端代碼和客戶端代碼各自的特定優(yōu)勢(shì)。有一點(diǎn)很明顯,那就是 SharePoint 開(kāi)發(fā)人員現(xiàn)在編寫的客戶端代碼比過(guò)去多很多。
其他資源
有關(guān)詳細(xì)信息,請(qǐng)參閱以下資源:
-
使用 SharePoint Foundation 服務(wù)器端對(duì)象模型
-
使用 SharePoint Foundation 2010 托管客戶端對(duì)象模型
-
解決方案概述
-
ECMAScript 類庫(kù)
-
Visual Studio 2010 中的 SharePoint 2010 開(kāi)發(fā)工具入門
-
SharePoint 開(kāi)發(fā)中心
-
SharePoint 2010 客戶端對(duì)象模型資源中心(該鏈接可能指向英文頁(yè)面)
-
Microsoft SharePoint 2010 SDK
-
Microsoft SharePoint 團(tuán)隊(duì)博客
關(guān)于作者
Ted Pattison?是一位作家兼講師,同時(shí)也是專門從事 SharePoint 技術(shù)培訓(xùn)的?Critical Path Training(該鏈接可能指向英文頁(yè)面)公司的共同創(chuàng)始人。作為 Microsoft SharePoint 最有價(jià)值的專家 (MVP),Ted 經(jīng)常與 Microsoft Developer Platform Evangelism 小組合作,以便在產(chǎn)品生命周期的 Alpha 和 Beta 階段及早進(jìn)行研究并為開(kāi)發(fā)人員創(chuàng)作 SharePoint 培訓(xùn)材料。Ted 還是?Inside Microsoft SharePoint 2010(該鏈接可能指向英文頁(yè)面)?一書的合著者。
總結(jié)
以上是生活随笔為你收集整理的了解 SharePoint 2010 开发中的关键点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 信用卡额度太低怎么养卡提额
- 下一篇: 去年人民币跨境收付19.67万亿,同比增