Sharepoin学习笔记—架构系列--03 Sharepoint的处理(Process)与执行模型(Trust Model) 2
???? 上文我們了解了一個(gè)外部Http Request進(jìn)入IIS 工作進(jìn)程(W3WP)的處理與執(zhí)行信任模型,這個(gè)階段是Sharepoint的四種執(zhí)行模型都必須經(jīng)過的處理階段,其中Sharepoint場解決方案與任何 ASP.NET 應(yīng)用程序一樣就是在 IIS 工作進(jìn)程(w3wp)中運(yùn)行的,所以上文也就包含了場解決方案的處理與執(zhí)行信任模型。
???? 這里繼續(xù)我們的話題,就是看看Sharepoint的沙盒解決方案在這方面是什么情況。
???? 沙盒解決方案是 SharePoint 2010 的新功能。沙盒解決方案是直接部署到網(wǎng)站集根網(wǎng)站中(The top Website of the Site Collection)的指定庫的資源集合。此庫稱為"解決方案庫(Solution Gallery)"。我們可以像場解決方案一樣,將沙盒解決方案打包為 SharePoint 解決方案包 (WSP)。不過,可以通過 Web 用戶界面 (UI) 直接上傳 WSP 來部署沙盒解決方案,而不必物理訪問服務(wù)器文件系統(tǒng),也不必 IT 團(tuán)隊(duì)參與。相反,網(wǎng)站集管理員確定誰有權(quán)限向其網(wǎng)站集添加沙盒解決方案。所以,沙盒解決方案對(duì)開發(fā)和管理團(tuán)隊(duì)是很有誘惑力的。
一、IIS工作進(jìn)程(w3wp)交權(quán)給執(zhí)行管理器(Execution Manager)
???? 如果用戶的Http 請(qǐng)求(Http Request)中包含有對(duì)沙盒解決方案的處理模型,Http請(qǐng)求到了IIS工作進(jìn)程(w3wp), IIS工作進(jìn)程(w3wp)就會(huì)發(fā)現(xiàn),這個(gè)請(qǐng)求里涉及到沙盒處理模型,這時(shí),IIS工作進(jìn)程(w3wp)就會(huì)調(diào)用它里面運(yùn)行的執(zhí)行管理器(Execution Manager),由執(zhí)行管理器(Execution Manager)來接管下一步的處理權(quán)移交。如下圖:
???? 上圖中的SPUCHostService.exe、SPUCWorkerProcess.exe 和 SPUCWorkerProcessProxy.exe 文件位于
%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode。
?
二、執(zhí)行管理器(Execution Manager)交權(quán)給沙盒工作進(jìn)程(SPUCWorkerProcess)
???? IIS 工作進(jìn)程中運(yùn)行的 SharePoint執(zhí)行管理器(Execution Manager)負(fù)責(zé)查找沙盒解決方案的代碼將在其中運(yùn)行的沙盒工作進(jìn)程(SPUCWorkerProcess)(如果未運(yùn)行任何沙盒工作進(jìn)程,則負(fù)責(zé)啟動(dòng)一個(gè)沙盒工作進(jìn)程)。
???? 請(qǐng)注意,執(zhí)行管理器(Execution Manager)啟動(dòng)或定位的沙盒工作進(jìn)程(SPUCWorkerProcess)并不一定是在同一服務(wù)器上,這可以從上面的示意圖中看出。
2.1沙盒工作進(jìn)程(SPUCWorkerProcess) 宿主機(jī)的要求
???? 一般而言,執(zhí)行管理器(Execution Manager)會(huì)在Sharepoint服務(wù)器場中任何運(yùn)行 SharePoint Foundation 沙盒代碼服務(wù) (SPUCHostService: Sharepoint User Code Host Service) 的服務(wù)器上啟動(dòng)此沙盒工作進(jìn)程(SPUCWorkerProcess)。
???? 在 Windows"服務(wù)"對(duì)話框中,它稱作"SharePoint 2010 用戶代碼主機(jī)"服務(wù),如下圖:
???? SharePoint Foundation 沙盒代碼服務(wù)(SPUCHostService)在服務(wù)器場帳戶下運(yùn)行,此帳戶與應(yīng)用程序池帳戶(Application Pool Account)擁有一樣的權(quán)限,此帳戶歸屬于沙盒代碼服務(wù)所運(yùn)行的宿主服務(wù)器上的WSS_WPG、WSS_ADMIN_WPG、IIS_USERS這三個(gè)組。
2.2運(yùn)行Microsoft SharePoint Foundation沙盒代碼服務(wù)(SPUCHostService)物理服務(wù)器的定位模式
???? 運(yùn)行 SharePoint Foundation 沙盒代碼服務(wù)的服務(wù)器可以是(但并不一定是)運(yùn)行 IIS 工作進(jìn)程的前端 Web 服務(wù)器。可在管理中心應(yīng)用程序內(nèi)配置要使用的服務(wù)器,這種配置有兩種選項(xiàng)。
???? I、"本地模式(local mode)":這意味著將在運(yùn)行 IIS 工作進(jìn)程(W3WP)的同一前端 Web 服務(wù)器上處理對(duì)沙盒解決方案的每個(gè)請(qǐng)求,即本地處理。
???? II、"遠(yuǎn)程模式(remote mode)"(有時(shí)稱作"相似性模式[affinity mode]"):在此模式中啟動(dòng)每個(gè)沙盒進(jìn)程,執(zhí)行管理器將查找運(yùn)行 SharePoint Foundation 沙盒代碼服務(wù)的服務(wù)器,該服務(wù)器已在其 SPUCWorkerProcess進(jìn)程內(nèi)為相同的沙盒解決方案創(chuàng)建了 一個(gè)應(yīng)用程序域(application domain)。(如果其他網(wǎng)站集的另一個(gè)用戶之前已請(qǐng)求該相同的沙盒解決方案,則將出現(xiàn)此情況)。如果存在一個(gè)匹配的應(yīng)用程序域,則會(huì)將請(qǐng)求發(fā)送到相同的應(yīng)用程序域以進(jìn)行處理。如果運(yùn)行 SharePoint Foundation 沙盒代碼服務(wù)的任何服務(wù)器都不具有沙盒解決方案的應(yīng)用程序域,則執(zhí)行管理器會(huì)將請(qǐng)求分配給這些服務(wù)器中最閑的服務(wù)器。之后,該服務(wù)器將創(chuàng)建所需的應(yīng)用程序域并處理對(duì)沙盒解決方案的請(qǐng)求。
????????? 不管使用的是"本地模式"還是"相似性模式",沙盒工作進(jìn)程中的應(yīng)用程序域(application domain)都將在處理完請(qǐng)求后保持活動(dòng)狀態(tài),且如果存在對(duì)相同沙盒解決方案的其他請(qǐng)求,則將重用該應(yīng)用程序域。
????????? 默認(rèn)情況下,由給定服務(wù)器處理的所有沙盒解決方案都在相同的沙盒工作進(jìn)程中運(yùn)行,但這種配置是可以通過object Model進(jìn)行修改的。每個(gè)沙盒解決方案會(huì)在常規(guī)進(jìn)程(common process)中獲取其自己的應(yīng)用程序域(application domain),而這種配置也是可以通過object Model進(jìn)行修改的
2.3 運(yùn)行"Microsoft SharePoint Foundation沙盒代碼服務(wù)"物理服務(wù)器的分配方法
?????? 如果你的服務(wù)器場包含了若干臺(tái)服務(wù)器,那么你既可以在所有物理服務(wù)器上啟動(dòng)"Microsoft SharePoint Foundation沙盒代碼服務(wù)",也可以只選擇在某幾臺(tái)應(yīng)用服務(wù)器上啟動(dòng)"Microsoft SharePoint Foundation沙盒代碼服務(wù)"。
?????? 當(dāng)然你也可以準(zhǔn)備一臺(tái)配置比較高的服務(wù)器加入到服務(wù)器場中專門用于運(yùn)行"Microsoft SharePoint Foundation沙盒代碼服務(wù)"。這樣,無論服務(wù)器場中的哪一臺(tái)前端服務(wù)器需要運(yùn)行沙盒解決方案中的自定義代碼,這些請(qǐng)求都會(huì)被發(fā)送到這臺(tái)強(qiáng)大的物理服務(wù)器上進(jìn)行處理。
三、沙盒工作進(jìn)程(SPUCWorkerProcess) 內(nèi)的代碼執(zhí)行和安全模型
?????? 前面我們提到,沙盒方案其實(shí)就是一種"受限"方案,正因?yàn)槭芟?#xff0c;所以才安全。所以,在沙盒工作進(jìn)程(SPUCWorkerProcess)中運(yùn)行的所有代碼會(huì)受到執(zhí)行和訪問約束的限制。
?????? 這種約束有兩個(gè)體系:
??????? 3.1、第一個(gè)體系稱作"服務(wù)器端對(duì)象模型約束"
?????????????? 此約束體系僅適用于沙盒解決方案中的代碼對(duì)主 SharePoint Foundation 程序集(即 Microsoft.SharePoint.dll)的調(diào)用,其調(diào)用只作用于Microsoft.SharePoint.dll中的部分object model。這種約束不僅僅是指從用戶創(chuàng)建的Sharepoint Solution中調(diào)用Microsoft.SharePoint.dll,而且還包括從Sharepoint的其它程序集(eg: Microsoft.Sharepoint.Linq.dll)來調(diào)用Microsoft.SharePoint.dll程序集。
???????????? 3.1.1服務(wù)器端對(duì)象模型約束體系中的主要限制是:
??????????????????? 只能從沙盒解決方案調(diào)用 Microsoft.SharePoint.dll 程序集中的部分 API。調(diào)用任何禁止的 API 會(huì)引發(fā)異常(將捕獲該異常,并將其作為錯(cuò)誤報(bào)告給用戶)。
??????????????????? 以下是可訪問的 SharePoint 對(duì)象模型的一些限制:
- SPWebApplication 類不可用。此外,這意味著,沙盒解決方案無法訪問其托管網(wǎng)站集外部的任何內(nèi)容。
- Microsoft.SharePoint.WebControls 命名空間中的所有類幾乎都不可用,這意味著,您只能使用沙盒解決方案中的 ASP.NET 控件。
?????????????3.1.2 服務(wù)器端對(duì)象模型約束通過以下機(jī)制來施加:
?????????????????? 此限制由一對(duì)位于%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode\assemblies 中的特別受限版本的 Microsoft.SharePoint.dll 程序集(稱作填充程序 程序集)實(shí)現(xiàn)。這兩個(gè)版本與標(biāo)準(zhǔn) Microsoft.SharePoint.dll 程序集的主要差異是,它們僅包含標(biāo)準(zhǔn)版本中的部分類和成員。
?????????????????? 這兩個(gè)填充程序程序集之一由沙盒工作進(jìn)程(SPUCWorkerProcess)加載,另一個(gè)填充程序程序集在完全信模式下運(yùn)行的特殊代理進(jìn)程 (SPUCWorkerProcessProxy) 中加載,并由 SharePoint Foundation沙盒代碼服務(wù)(SPUCHostService)管理。
???????????????? 此外,標(biāo)準(zhǔn) Microsoft.SharePoint.dll 程序集也在此代理進(jìn)程中加載。
????????????????? 這兩個(gè)填充程序程序集的主要工作是:
????????????????? I、篩選出禁止的 SharePoint 類和成員
???????????????????? 在從沙盒工作進(jìn)程中的任何代碼調(diào)用 Microsoft.SharePoint.dll 時(shí),它將重定向到程序集的填充程序版本。如果要調(diào)用的 API 未在填充程序程序集中,則將引發(fā)異常(將捕獲該異常,并將其作為錯(cuò)誤報(bào)告給用戶)。
???????????????????? 當(dāng)沙盒解決方案調(diào)用填充程序程序集中包含的已批準(zhǔn)的 API 時(shí),第一個(gè)填充程序程序集會(huì)(它由沙盒工作進(jìn)程SPUCWorkerProcess加載)在完全信任代理進(jìn)程中將此 API 傳遞給第二個(gè)填充程序程序集(它由特殊代理進(jìn)程?????? (SPUCWorkerProcessProxy)加載),而第二個(gè)填充程序程序集會(huì)將此 API 傳遞給標(biāo)準(zhǔn) Microsoft.SharePoint.dll。任何返回的結(jié)果將傳遞回原始調(diào)用代碼。可通過 .NET 遠(yuǎn)程來實(shí)現(xiàn)此跨進(jìn)程交互。
??????????????????? 沙盒工作進(jìn)程和完全信任代理進(jìn)程總是一起啟動(dòng)并成對(duì)出現(xiàn)。如果其中一個(gè)進(jìn)程崩潰,則另一個(gè)進(jìn)程也會(huì)停止。
????????????????? II、對(duì)傳遞給Sharepoint API的參數(shù)進(jìn)行特殊限制
??????????????????? 該限制也由填充程序程序集強(qiáng)制實(shí)施。我們可似從沙盒解決方案中調(diào)用某些 SharePoint API,但只會(huì)將針對(duì)參數(shù)的特殊限制傳遞給這些 API。這些輸入限制由填充程序程序集強(qiáng)制實(shí)施,并確保在發(fā)生沖突時(shí)引發(fā)異常。在 SharePoint Foundation 2010 中,僅 SPSite(String) 和 SPSite(Guid) 構(gòu)造函數(shù)屬于此應(yīng)用情況。雖然它們對(duì)沙盒解決方案可用,但只能將引用安裝了沙盒解決方案的網(wǎng)站集的 URL 或 GUID 傳遞給它們。
???????????????????? 因?yàn)榈诙€(gè)填充程序程序集和標(biāo)準(zhǔn) Microsoft.SharePoint.dll 在完全信任的進(jìn)程中運(yùn)行,所以上述限制就不 適用于對(duì) Microsoft.SharePoint.dll 程序集中的 API 的調(diào)用,更進(jìn)一步說就是通過這些API就可以完成某些在沙盒方案中被禁止的操作。比如: 對(duì) GetLocalizedString 方法的調(diào)用可從文件系統(tǒng)中的資源文件讀取,而對(duì) SPList 對(duì)象的調(diào)用可讀取并寫入到內(nèi)容數(shù)據(jù)庫中,無論其所在的服務(wù)器如何。(但是,不能將文件部署到沙盒解決方案中的磁盤,因此,必須將 .resx 作為場解決方案單獨(dú)安裝。)
?
????????? 3.2、第二個(gè)體系稱作"一般約束"
??????????????? 此約束體系適用于所有其他 調(diào)用,包括對(duì)所有其他 SharePoint 程序集和 .NET Framework 程序集的調(diào)用,只要不是對(duì)主 SharePoint Foundation 程序集(即 Microsoft.SharePoint.dll)的調(diào)用就行。
??????????????? 上面這兩個(gè)體系是互斥的:一般約束不 適用于對(duì) Microsoft.SharePoint.dll 程序集的調(diào)用,你只能二選 一。此外,還有一些由沙盒解決方案中使用的分頁呈現(xiàn)系統(tǒng)產(chǎn)生的雜項(xiàng)約束。
????????????????? "一般約束"通過兩種機(jī)制來施加:
?????????????? I、第一種機(jī)制
??????????? 是通過在wss_usercode.config 文件所定義的高度限制的?CAS 策略來大大限制沙盒工作進(jìn)程中可執(zhí)行的代碼,此文件在%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG 中定義,并在 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\UserCode 下的 web.config 文件中引用了該策略。(微軟不支持更改此文件。)由 CAS 策略施加的限制如下:
- 沙盒中的代碼不能調(diào)用非托管代碼。
- 沙盒中的代碼不能調(diào)用 Microsoft .NET Framework 3.5 反射 API。
- 沙盒中的代碼只能調(diào)用具有 AllowPartiallyTrustedCallersAttribute 屬性的 .NET Framework 3.5 程序集。這將阻止對(duì)約三分之二的 .NET Framework 3.5 API(例如,包括 System.Printing)的訪問。此外,一些 SharePoint 程序集不具有此屬性。
???????????????????? CAS 策略將強(qiáng)名稱 Microsoft Office 程序集視作例外。這些程序集授予了完全信任。
????????????? II、第二種機(jī)制
??????????????????? 是通過安全令牌來實(shí)施,即給沙盒工作進(jìn)程賦予一個(gè)低權(quán)限的安全令牌。
- 該令牌拒絕進(jìn)程對(duì)文件系統(tǒng)進(jìn)行讀取或?qū)懭氲臋?quán)限。
- 該令牌拒絕進(jìn)程對(duì)網(wǎng)絡(luò)進(jìn)行調(diào)用的權(quán)限。因此,只能訪問運(yùn)行沙盒工作進(jìn)程的服務(wù)器上可用的資源。例如,無法訪問外部數(shù)據(jù)庫。
- 該令牌拒絕進(jìn)程對(duì)注冊(cè)表進(jìn)行寫入的權(quán)限。
- 該令牌拒絕對(duì)未在常規(guī)程序集緩存(GAC)中的任何程序集進(jìn)行調(diào)用的權(quán)限,即使它具有 AllowPartiallyTrustedCallersAttribute 屬性也是如此,否則它將符合從沙盒工作進(jìn)程進(jìn)行調(diào)用的資格。
??????????????????? 沙盒解決方案自身的部署階段在沙盒工作進(jìn)程中運(yùn)行,并受相同執(zhí)行約束的限制。例如,在部署沙盒解決方案時(shí),無法將文件部署到磁盤。這是用戶控件(ASCX 文件)不能位于沙盒解決方案中的主要原因。
?
四、關(guān)于沙盒方案資源使用的限制
??????????????? 沙盒方案既然把一定的權(quán)力下放,但由此卻帶來潛在的問題,那就是對(duì)Sharepoint資源的分配。設(shè)想如果不加控制,那么某個(gè)用戶就可能把特定的資源消耗殆盡。所以,Sharepoint也就自然引入了針對(duì)資源的使用限制,具體有如下三條限制規(guī)則
- 每個(gè)請(qǐng)求(請(qǐng)求遭到處罰):對(duì)于完成沙盒解決方案所需的時(shí)間有一個(gè)硬性限制。默認(rèn)情況下,此時(shí)間限制為 30 秒。如果沙盒解決方案超出了該限制,則將終止請(qǐng)求(而非沙盒工作進(jìn)程)。(此限制是可配置的,但只能通過針對(duì)對(duì)象模型的自定義代碼進(jìn)行此操作。對(duì)象模型的相關(guān)部分對(duì)沙盒解決方案不可用,因此,任何沙盒解決方案都無法更改此限制。)
- 每個(gè)請(qǐng)求(進(jìn)程遭到處罰):有一組適用于請(qǐng)求的附加資源限制(共 15 條)。如果請(qǐng)求超出某個(gè)限制,則將終止進(jìn)程(以及進(jìn)程中運(yùn)行的所有 沙盒解決方案)。
- 每天/每個(gè)網(wǎng)站集(網(wǎng)站集遭到處罰):每個(gè)網(wǎng)站集均受可配置的每日"資源點(diǎn)"最大數(shù)的限制。這些點(diǎn)基于某種算法進(jìn)行累計(jì),該算法會(huì)考慮網(wǎng)站集中安裝的沙盒解決方案對(duì) 15 類資源的使用。當(dāng)網(wǎng)站集超出其允許的最大點(diǎn)數(shù)時(shí),該網(wǎng)站集中的所有沙盒解決方案將終止,且在剩余時(shí)間內(nèi)再也無法運(yùn)行。
五、沙盒的分頁呈現(xiàn)
??????? 當(dāng)客戶端計(jì)算機(jī)請(qǐng)求包含沙盒解決方案中的組件(例如,沙盒解決方案中部署的 Web 部件)的 SharePoint 頁時(shí),SharePoint 會(huì)呈現(xiàn)多個(gè)頁對(duì)象。其中一個(gè)頁對(duì)象在 Microsoft ASP.NET 工作進(jìn)程 (w3wp.exe) 中呈現(xiàn),而其他頁對(duì)象在沙盒工作進(jìn)程中呈現(xiàn)。所有非沙盒組件會(huì)在 ASP.NET 工作進(jìn)程中的頁上呈現(xiàn),而第一個(gè)沙盒組件會(huì)在沙盒工作進(jìn)程中的一個(gè)頁對(duì)象上呈現(xiàn)。在完全呈現(xiàn)沙盒工作進(jìn)程中的該頁時(shí),會(huì)將該頁并入 ASP.NET 進(jìn)程中的頁對(duì)象。如果用戶請(qǐng)求的頁上有多個(gè)沙盒組件,則將在這些組件在沙盒工作進(jìn)程中所對(duì)應(yīng)的頁對(duì)象上單獨(dú)呈現(xiàn)它們。反過來,每個(gè)此類頁對(duì)象將并入 ASP.NET 進(jìn)程中的頁對(duì)象。
六、擺脫沙盒限制
???????沙盒解決方案可通過兩大方式擺脫常規(guī)限制。
?????? ?1.使用客戶端代碼訪問無法從沙盒解決方案中的服務(wù)器端代碼訪問的資源。
????????? 例如,沙盒解決方案可包含帶 JavaScript 的自定義網(wǎng)頁,JavaScript 可調(diào)用 SharePoint 的 JavaScript 客戶端對(duì)象模型。此外,沙盒解決方案可包含承載 Microsoft Silverlight 應(yīng)用程序的 Web 部件。后面的應(yīng)用程序可調(diào)用 SharePoint 的 Silverlight 客戶端對(duì)象模型。沙盒解決方案上的任何限制都不適用于客戶端代碼。不存在以下限制:代碼執(zhí)行限制、資源訪問限制和資源使用率限制。
?????? ? 2.通過完全信任代理。
???????? 即開發(fā)一個(gè)服務(wù)器場解決方案,它包括派生自 SPProxyOperation 的一個(gè)或多個(gè)類,其中的每個(gè)類均定義一個(gè)將在完全信任下運(yùn)行的操作,并且可通過 ExecuteRegisteredProxyOperation 方法從沙盒解決方案中調(diào)用這些類。具體而言,將在運(yùn)行標(biāo)準(zhǔn) Microsoft.SharePoint.dll 程序集的相同代理進(jìn)程 (SPUCWorkerProcessProxy.exe) 中執(zhí)行這些完全信任代理操作。代理操作可將數(shù)據(jù)返回到沙盒解決方案。
七、Sharepoint執(zhí)行的其它情況
??????? 并不是所有的Sharepoint 實(shí)施都依賴于IIS工作進(jìn)程(IIS worker process),沙盒工作進(jìn)程(sandboxed worker process)或其代理進(jìn)程(proxy process)。下面就是一些例子:
- Sharepoint的Timer Service,用于執(zhí)行預(yù)設(shè)的作業(yè),它可以影響其它服務(wù),它以Farm帳戶運(yùn)行在owstimer進(jìn)程下。
- SharePoint的Tracing Service ,以本地的服務(wù)帳戶(local service account)運(yùn)行在wsstracing進(jìn)程下。
- SharePoint Administration Service 以本地系統(tǒng)帳戶(local system account)運(yùn)行在wssadmin進(jìn)程下。
總結(jié)
以上是生活随笔為你收集整理的Sharepoin学习笔记—架构系列--03 Sharepoint的处理(Process)与执行模型(Trust Model) 2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】Microsoft Cloud全新
- 下一篇: 【转】刨根究底字符编码之零——前言