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