Sharepoin学习笔记—架构系列--05 Sharepoint的四种执行模型 2
???? 上一篇我們看了場(chǎng)解決方案與沙盒方案兩種執(zhí)行模型,其中場(chǎng)解決方案包括有完全信任方式與Bin/CAS方式兩種,這里讓我們繼續(xù)來(lái)看看最后一個(gè)執(zhí)行模型,即混合模型(或混合模式)。
三、混合模式(hybrid approaches)
???? 所謂混合模式就是指雖然解決方案運(yùn)行在沙盒模式,但卻可以通過(guò)各種機(jī)制來(lái)訪問(wèn)完全信任模式的代碼,換句話說(shuō),就是把沙盒模式與完全信任模式結(jié)合起來(lái)。當(dāng)然,我們可以把這種模式看成兩個(gè)松耦合方式的組合,這是因?yàn)樯澈心J绞遣渴鹪诰W(wǎng)站集(Site Collection)的解決方案庫(kù)(Solution Gallery),而完全信任解決方案卻是部署到服務(wù)器場(chǎng),它們的開(kāi)發(fā)可以是孤立的,非同時(shí)進(jìn)行的,并且完全信任模式的組件可以被一個(gè)或多個(gè)沙盒模式組件使用。通常情況下,完全信任模式的解決方案需要通過(guò)IT中心團(tuán)隊(duì)進(jìn)行集中開(kāi)發(fā)和掌控并提供給沙盒模式的解決方案使用。
?????沙盒模式可以使用三種類(lèi)型的完全信任組件:
- 完全信任代理(Full trust proxies). 通過(guò)編寫(xiě)一個(gè)繼承自SPProxyOperation抽象類(lèi)的自定類(lèi),在此類(lèi)中實(shí)現(xiàn)完全信任模式下的代碼功能,然后把它的程序集部署到GAC(global assembly cache),通過(guò)此方式把完全信任代理功能暴露給沙盒以沙盒代碼調(diào)用。
- 外部?jī)?nèi)容類(lèi)型(External content types).你可以通過(guò)外部?jī)?nèi)容類(lèi)型來(lái)從LOB應(yīng)用程序(line-of-business application)以及其它通過(guò)BCS連接的外部數(shù)據(jù)源獲取外部數(shù)據(jù)。外部?jī)?nèi)容類(lèi)型必須以完全信任模式進(jìn)行部署。不管怎樣,你可以在沙盒環(huán)境內(nèi)通過(guò)創(chuàng)建外部列表(External Lists)來(lái)獲取通過(guò)沙盒方式提取不到的數(shù)據(jù)。
- 用戶(hù)自定義的工作流活動(dòng)(Custom workflow activities). 通過(guò)創(chuàng)建用戶(hù)自定義的以編碼實(shí)現(xiàn)的工作流活動(dòng),并且把它以完全信任模式部署到GAC(global assembly cache),然后就可以在沙盒里調(diào)用這個(gè)工作流活動(dòng)了。
接下來(lái)我們分別看看上述三種類(lèi)型的實(shí)現(xiàn)細(xì)節(jié)。
1、完全信任代理(Full trust proxies).
???????????? ?Hybrid execution using a full-trust proxy
??????????
?
????? 當(dāng)在沙盒中使用完全信任代理時(shí),代碼訪問(wèn)安全 (CAS) 策略會(huì)允許沙盒代碼訪問(wèn)完全信任代理的程序集,你可以通過(guò)在Feature Receiver中編程來(lái)向Farm中注冊(cè)代理程序集,也可以通過(guò)Window PowerShell工具來(lái)注冊(cè)代理程序集。
????? 你的沙盒代碼必須使用SPProxyOperationsArgs類(lèi)來(lái)構(gòu)造需要傳遞給完全信任代理的參數(shù)。當(dāng)你調(diào)用 SPUtility.ExecuteRegisteredProxyOperation方法時(shí),沙盒工作進(jìn)程會(huì)激活完全信任代理并把相關(guān)參數(shù)傳遞進(jìn)去,然后完全信任代理的代碼會(huì)在完全信任方式下運(yùn)行,在完成其負(fù)責(zé)的處理任務(wù)后,完全信任代理會(huì)返回相關(guān)參數(shù)(如果有的話)給沙盒解決方案,并繼續(xù)由沙盒方案完成其它任務(wù)。
?????? 需要注意的是,Sharepoint的上下文(SPContext)不適用于代理操作類(lèi),也就是說(shuō),如果你想要在代理操作類(lèi)中使用上下文相關(guān)信息,你就需要傳遞創(chuàng)建上下文對(duì)象所需要的參數(shù)進(jìn)入代理類(lèi)。比如:如果你需要在代理中存取某個(gè)Site,那么你就需要傳遞Site ID參數(shù)進(jìn)入代理類(lèi),然后代理類(lèi)會(huì)在它的執(zhí)行代碼中使用這引Site ID來(lái)構(gòu)建一個(gè)site,接下來(lái)你就可以使用site.RootWeb.CurrentUser來(lái)獲取SPUser對(duì)象及其信息了。
?????? 下圖表示這種處理方式的主要工作邏輯與重要組件
?????????????????????
?
- SPProxyOperation. 這個(gè)類(lèi)提供了一個(gè)抽象類(lèi)給完全信任代理。此類(lèi)包含了一個(gè)叫Execute的方法,在這個(gè)方法中你可以定義你需要完成的完全信息代理操作。它的完全信任代理類(lèi)需要部署到GAC(global assembly cache)并需要使用我們上面提到的方法注冊(cè)到Sharepoin場(chǎng)中。
- SPProxyOperationArgs. 這個(gè)類(lèi)提供了一個(gè)抽象的基類(lèi)以供你創(chuàng)建傳遞給完全信任代理類(lèi)的參數(shù),你必須創(chuàng)建一個(gè)可序列化的類(lèi),此類(lèi)繼承自SPProxyOperationArgs ,在此類(lèi)中添加屬性來(lái)實(shí)現(xiàn)參數(shù)的設(shè)置與獲取。
- SPUtility.ExecuteRegisteredProxyOperation.這個(gè)靜態(tài)方法用于讓你在沙盒代碼中激活完全信任代理。這個(gè)方法需要一個(gè)程序集名,一個(gè)類(lèi)型名以及一個(gè)SPProxyOperationArgs對(duì)象。此方法返回一個(gè)對(duì)象類(lèi)型的變?cè)?an argument of type Object)給它的調(diào)用者。
???? 需要注意的是:任何傳遞給代理類(lèi)的參數(shù)類(lèi)(proxy arguments class)中的所定義的類(lèi)型都必須被標(biāo)記為serializable,而在代理操作中返回的類(lèi)型也需要被標(biāo)記為serializable,這樣做的目的是在進(jìn)程之間進(jìn)行信息傳遞。
???? 不管是代理中的操作(operation)還是代理類(lèi)的參數(shù)類(lèi)都需要被部署到GAC。你不能把在沙盒代碼里定義的類(lèi)型傳遞給代理,這是因?yàn)榇聿⒉粫?huì)訪問(wèn)你所加載的沙盒程序集。
2、外部?jī)?nèi)容類(lèi)型(External content types)
?? ?? 外部?jī)?nèi)容類(lèi)型為可重用的元數(shù)據(jù)集合,其中包含連接信息和數(shù)據(jù)定義以及要應(yīng)用于特定外部數(shù)據(jù)類(lèi)別的行為。創(chuàng)建外部?jī)?nèi)容類(lèi)型通常是使用 Microsoft Business Connectivity Services (BCS) 將外部數(shù)據(jù)源中的數(shù)據(jù)添加到 SharePoint 2010中的第一步。
???? ?如果你想要在沙盒解決方案中使用外部數(shù)據(jù)類(lèi)型,那么你就只能通過(guò)混合方式來(lái)實(shí)現(xiàn)了。
????? 外部?jī)?nèi)容類(lèi)型(External content types)必須在場(chǎng)級(jí)別(Farm-scoped)的Feature中定義,它不能作為沙盒方案的一部分進(jìn)行部署。
????? 為了簡(jiǎn)化外部?jī)?nèi)容類(lèi)型的創(chuàng)建,Business Connectivity Services 提供了兩種開(kāi)發(fā)工具:Microsoft SharePoint Designer 2010 中的外部?jī)?nèi)容類(lèi)型設(shè)計(jì)器和 Microsoft Visual Studio 2010 中的 Business Connectivity Services Model Designer。
????? 如果您的外部數(shù)據(jù)源具有 Windows Communication Foundation (WCF)、Web 服務(wù)或基于 .NET Framework 程序集的集成服務(wù),或?yàn)楹?jiǎn)單 Microsoft SQL Server 數(shù)據(jù)庫(kù),則可使用 SharePoint Designer 中的外部?jī)?nèi)容類(lèi)型設(shè)計(jì)器來(lái)發(fā)現(xiàn)您的外部系統(tǒng),并創(chuàng)建外部?jī)?nèi)容類(lèi)型,而無(wú)需編寫(xiě)代碼或 XML。但是,如果您的外部系統(tǒng)很復(fù)雜或不受 SharePoint Designer 支持,則可以使用 Visual Studio(提供 Intellisense)中的 XML 編輯器來(lái)創(chuàng)建 XML 模型,或使用 Visual Studio外部?jī)?nèi)容類(lèi)型設(shè)計(jì)器來(lái)創(chuàng)建 .NET 連接程序集(該程序集通過(guò) .NET Framework 代碼提供自定義后端集成邏輯)。
????? 在成功創(chuàng)建并部署好外部?jī)?nèi)容類(lèi)型后,你就可以在沙盒方案中基于外部?jī)?nèi)容類(lèi)型創(chuàng)建外部數(shù)據(jù)列表了(External List),并通過(guò)外部數(shù)據(jù)列表(External List)來(lái)獲取外部數(shù)據(jù)。
????? Hybrid Execution with external content types
???????????????????
?????? 我們可以通過(guò)使用外部數(shù)據(jù)列表(External List)的SPList對(duì)象模型來(lái)在沙盒中使用代碼獲取外部數(shù)據(jù)。我們不能在沙盒代碼中直接使用BCS運(yùn)行時(shí)的APIs來(lái)達(dá)到獲取外部數(shù)據(jù)的目的。
??????? Hybrid execution using an external list
????????????????
?
????? 當(dāng)在沙盒中獲取外部數(shù)據(jù)時(shí),我們必須要面對(duì)安全方面的問(wèn)題。
????? 通過(guò)前面的描述我們知道,沙盒方案通過(guò)外部數(shù)據(jù)列表(External List)獲取外部數(shù)據(jù),外部數(shù)據(jù)列表會(huì)調(diào)用BCS運(yùn)行時(shí)APIs來(lái)完成對(duì)外部數(shù)據(jù)的獲取,而與外部數(shù)據(jù)打交道的相關(guān)任務(wù)應(yīng)該是在用戶(hù)代碼代理服務(wù)(user code proxy service )中執(zhí)行。出于安全的考慮,當(dāng)上下文(Context)進(jìn)入沙盒工作進(jìn)程時(shí),Sharepoint會(huì)移除與上下文綁定的用戶(hù)憑證。因此,與此用戶(hù)相關(guān)聯(lián)的Windows Identity就不再會(huì)作用于沙盒工作進(jìn)程與沙盒代理進(jìn)程,由于用戶(hù)的Windows Identity不再起作用, Sharepoint的Managed Account就成為了沙盒通過(guò)BCS訪問(wèn)外部數(shù)據(jù)或外部服務(wù)的基礎(chǔ),所有的沙盒用戶(hù)都將會(huì)基于Sharepoint的Managed Account來(lái)運(yùn)行用戶(hù)代碼代理服務(wù)(user code proxy service)。
????? 當(dāng)BDC(Business Data Connectivity (BDC) Service)運(yùn)行時(shí)接收到請(qǐng)求外部數(shù)據(jù)的請(qǐng)求時(shí),它會(huì)判斷安全存儲(chǔ)服務(wù)(Secure Store Service (SSS))是否會(huì)參與安全憑證的管理, 我們知道安全存儲(chǔ)服務(wù)(Secure Store Service (SSS))可安全地為外部系統(tǒng)存儲(chǔ)憑證集并將這些憑證集與個(gè)人或組標(biāo)識(shí)相關(guān)聯(lián)。
在這里如果SSS要參與,那么與此請(qǐng)求相關(guān)聯(lián)的用戶(hù)標(biāo)識(shí)就會(huì)被提供給SSS,SSS負(fù)責(zé)把此用戶(hù)標(biāo)識(shí)與外部系統(tǒng)憑證集中的某個(gè)憑證進(jìn)行關(guān)聯(lián),然后SSS會(huì)向BDC運(yùn)行時(shí)返回映射后的那個(gè)外部系統(tǒng)憑證,BDC就會(huì)使用這個(gè)映射憑證去訪問(wèn)外部數(shù)據(jù)。由于BDC不會(huì)接收單個(gè)用戶(hù)的憑證(credentials of individual users),所以你無(wú)法約束特定的用戶(hù)是否能從沙盒中訪問(wèn)外部數(shù)據(jù)。
???????下面的圖演示了這樣一個(gè)處理過(guò)程。
???????????????
??? 下面我們說(shuō)說(shuō)它的各個(gè)步驟:
?
3、用戶(hù)自定義的工作流活動(dòng)(Custom workflow activities)
??? Hybrid execution using a declarative workflow
?????????????????
??????? 通過(guò)這個(gè)方法,包含在用戶(hù)自定義工作流活動(dòng)中的完全信任代碼可以被沙盒工作進(jìn)程激活,并以異步方式運(yùn)行,從而達(dá)到沙盒與完全信任兩種方式混合的目的。
??????? 沙盒環(huán)境允許你部署工作流,在工作流中可以包含若干個(gè)工作流活動(dòng),Sharepoint提供了許多開(kāi)箱即用的工作流活動(dòng),我們也可以開(kāi)發(fā)自定義的工作流活動(dòng)并以完全信任方式部署到GAC(global assembly cache)中提供給沙盒使用。
???????? 為了創(chuàng)建完全信任工作流活動(dòng),我們需要設(shè)置Web.config文件,在里面加入authorizedType。這樣就使得你開(kāi)發(fā)的自定義工作流活動(dòng)具備和Sharepoint那些開(kāi)箱即用的工作流活動(dòng)一樣的狀態(tài)。下面的代碼就是authorizedType的設(shè)置示意 :
<configuration>?
<System.Workflow.ComponentModel.WorkflowCompiler>?
<authorizedType?Assembly="…"?Namespace="…"?TypeName="*"?Authorized="True"?/>?
</System.Workflow.ComponentModel.WorkflowCompiler>?
</system.web>?
????? 當(dāng)你加入一個(gè)授權(quán)類(lèi)型時(shí),Assembly屬性就是你的程序集的強(qiáng)名稱(chēng),Namespace屬性就是活動(dòng)類(lèi)所用的完全限定名稱(chēng)空間。
????? 你可以在沙盒內(nèi)創(chuàng)建與部署工作流活動(dòng),這些工作流活動(dòng)受到與沙盒一樣的約束,如果你想要突破這種約束,你就只能開(kāi)發(fā)與部署完全信任方式的工作流活動(dòng)。 需要注意的是,工作流引擎自身總是運(yùn)行在完全信任模式下的,當(dāng)你部署了一個(gè)沙盒中的工作流活動(dòng)時(shí),工作流引擎就會(huì)在完全信任模式的基礎(chǔ)上加入特定的約束規(guī)則從而附合沙盒的約束。
?????? 下面的圖示意了工作流是如何執(zhí)行的,那個(gè)declarative workflow工作流從沙盒方案中加載,而那個(gè)用戶(hù)自定義的完全信任工作流活動(dòng)則從GAC緩存(global assembly cache)中加載,。
?????? Hybrid execution with a custom workflow activity
?????????????
????????? Declarative workflow雖然是作為沙盒方案的一部分定義的,但它卻是在Owstimer.exe, W3wp.exe或user code proxy process.等進(jìn)程中運(yùn)行的,也就是說(shuō),它是由運(yùn)行在完全信任模式中的進(jìn)程執(zhí)行的。Declarative workflow不能在SharePoint Foundation 與 SharePoint Server之間移動(dòng),,如果必須,你只能在兩種環(huán)境中各創(chuàng)建一個(gè)等值的Declarative workflow,當(dāng)然,在SharePoint Server中提供的工作流活動(dòng)要多一些,并且Declarative workflow的管理也與SharePoint Foundation略有不同,但在打包與部署方面,二者是相同的。作為一個(gè)好的習(xí)慣,建議你用于開(kāi)發(fā)工作流的Sharepoint版本與生產(chǎn)機(jī)保持一致,這樣可以盡量減少后期不必要的麻煩。
總結(jié)
以上是生活随笔為你收集整理的Sharepoin学习笔记—架构系列--05 Sharepoint的四种执行模型 2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 白户办理信用卡好办吗
- 下一篇: 【转】1.4 Magento2语法讲解