SharePointServer2007頁面模型

餘二五發表於2017-11-14
雖然SharePoint Server 2007使用了ASP.NET 2.0的基礎頁面模型,SharePoint頁面基本上也是基於標準的aspx技術來構建,但SharePoint Server 2007的頁面模型仍然要比普通的ASP.NET應用複雜很多。對於一個SharePoint開發人員(和設計人員),瞭解SharePoint的頁面模型是非常非常重要的。

在SharePoint 2007中,將頁面分為兩種:Application Page和Site Page。Application Page是指SharePoint應用程式中用到的頁面。比如,當我們進入到一個SharePoint站點的站點設定中後,幾乎所有的站點設定頁面都是Application Page。如果我們看到位址列中的頁面路徑都是類似“http://sharepointsite/_layouts/xxx.aspx”這樣的格式,也就是說,頁面位於“_layouts”虛擬目錄中,那麼這個頁面就是Applicatoin Page。Application Page在物理上被存放在SharePoint Web前端伺服器的“Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12TEMPLATELayouts”目錄中,不能被使用者進行定製。而Site Page是指位於一個SharePoint站點中的普通頁面。比如,站點的首頁:“http://sharepointsite/default.aspx”,或者位於一個文件庫中的頁面:“http://sharepointsite/pages/xxx.aspx”,都是Site Page。

Application Page實際上和一個普通的ASP.NET頁面沒有任何區別。開發人員如果有需要,可以自己新增新的Application Page,你既可以在“Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12TEMPLATELayouts”目錄中新增新的頁面,也可以在這個目錄下建立新的子目錄(或虛擬目錄),來放置你的Application Page。在Application Page中,開發人員可以根據自己的需求,直接新增In-line code,這些code都會直接被執行,就像一個普通的ASP.NET應用程式一樣(當然,對於Code-behind的模式,Application Page也是支援的)。比如:

<script runat=”server”>


protected void Page_Load(Object sender, EventArgs e)

{

    // 程式碼…

}


</script>


對於Application Page,SharePoint 2007總是認為它們是安全的,因為,站點的管理員(非伺服器管理員)和使用者都沒有辦法直接修改Application Page,所以,SharePoint 2007會直接“執行”它們。

如果你要建立自己的Application Page,儘量遵守這樣的模式:
1、讓你的Application Page從“Microsoft.SharePoint.WebControls.LayoutsPageBase”繼承下來;
2、讓你的Application Page使用位於Layouts目錄中的“Application.master”這個Master Page;
3、在Layouts目錄中建立一個新的子目錄(或虛擬目錄)來放你的Application Page,不要和SharePoint自帶的Application Page混雜在一起。

Site Page比Application Page要更復雜一些。對於Site Page,我們通常根據它們是否已經被進行了定製(通過SharePoint Designer 2007),將Site Page分為Uncustomized Page和Customized Page。(在SPS2003中,使用的是Ghosted Page和Unghosted Page這兩個術語。)

當我們新建一個站點的時候,所有的頁面都是Uncustomized Page,這些頁面都是直接使用了存放在SharePoint Web前端伺服器磁碟上的頁面模板(位於“Program FilesCommon FilesMicrosoft SharedWeb Server Extensions12TEMPLATE”的各個子目錄中),換言之,這個新站點的頁面其實是“不存在的”,它們只是一個“標記”(這也就是在SPS2003中,它們被稱為Ghosted Page的原因),如果使用者訪問一個頁面,SharePoint會自動從磁碟上找到那個真正的頁面模板檔案,然後將其載入到記憶體中,解析它,並將其編譯成一個獨立的dll檔案(為了效能,這個dll會快取在磁碟上以避免下次重複編譯),然後載入這個dll,執行,輸出。

但是,如果站點設計人員用SharePoint Designer 2007開啟這個SharePoint站點,然後用SharePoint Designer開啟某個Site Page檔案,進行某些修改,儲存,SharePoint會自動將修改後的檔案內容儲存到站點所用的內容資料庫中,它就成了一個Customized Page。從此,這個Customized Page就和磁碟上的頁面模板“脫離關係”了。當使用者訪問這個頁面時,SharePoint會自動從內容資料庫中讀出這個檔案的內容,然後對其進行解析,執行。注意!這次,SharePoint不會再將其編譯成一個獨立的dll檔案了,實際上,SharePoint會在記憶體中載入這個頁面的結構,執行,然後輸出,然後將它從記憶體中解除安裝以節省記憶體。

從Uncustomized Page和Customized Page的執行模式上,我們就能看出它們的執行效率存在著不小的差別。首先,Uncustomized Page是位於磁碟上的,它的讀入速度會比較快,其次,Uncustomized Page會在第一次被訪問時就被編譯成一個dll,避免了重複編譯。比如,兩個不同SharePoint站點的首頁“default.aspx”如果都是Uncustomized Page,而且使用的是同一個頁面模板,它們只會被編譯一次。而Customized Page位於內容資料庫中,讀入速度比不上磁碟檔案,而且它不會被編譯成dll,而是隻會在記憶體中進行解析,執行。

但是,有意思的是,Customized Page的解析執行方式雖然在速度上可能要慢,但卻要更節省記憶體一些。因為在記憶體中載入一個頁面的結構,進行解析執行後,是可以再釋放掉的,而一個dll被載入後,是不能被釋放掉的。這是因為.NET不支援載入程式集後再解除安裝程式集,呵呵。(但.NET支援建立AppDomain後再釋放掉AppDomain。)

除了存放位置和執行效率上的不同,在程式碼安全上,Uncustomized Page和Customized Page也存在很大的區別。

類似於Applicaton Page,Uncustomized Page也是被SharePoint信任的頁面,位於Uncustomized Page裡面的ASP.NET In-line code會被直接執行。而Customized Page由於可以被站點設計者(可能他並非是伺服器管理員)通過SharePoint Designer向其中加任意的In-line code,所以,預設的安全規則根本不會允許Customized Page中的伺服器端程式碼被執行。

類似的,如果Uncustomized Page上面被放置一個伺服器端控制元件,是沒有問題的,但是,如果要向Customized Page上放一個伺服器端控制元件(包括Web Part),那麼這個控制元件就必須在站點的web.config中被標識為“Safe Control”(也就是增加新的“<SafeControl>”節點來標識某個控制元件是安全的)。

雖然SharePoint對Customized Page有這些安全上的限制,但是,伺服器管理員通過修改web.config檔案中的安全設定,是可以更改這樣的預設安全限制的。比如,如果你希望站點的“MyPages”目錄下的頁面,即使它們是Customized Page,也允許被包含伺服器端In-line code,可以在web.config中增加這樣的內容:

<SharePoint>

   <SafeMode …>

   <PageParserPaths>

      <PageParserPath VirtualPath=”/MyPages/*” CompilationMode=”Always”

         AllowServerSideScript=”true” AllowUnsafeControl=”true” IncludeSubFolders=”true”/>

   </PageParserPaths>


“CompilationMode”節點的值可以是:Never、Always和Auto,將其設定為Always,就可以強制進行編譯。“AllowServerSideScript”是指定是否允許伺服器端的程式碼,“AllowUnsafeControl”是指定是否允許非安全(也就是沒有在“SafeControls”區域指定為安全)的控制元件。

最後要提醒的是,雖然通過修改web.config中的設定可以讓所有的Site Page都能包含伺服器端程式碼,但如非必要,儘量不要這樣做。因為這將會使有許可權對站點進行設計的人,通過使用SharePoint Designer,就可以在任何頁面中新增In-line code,來進行任何操作。

SharePoint SDK參考:
“Application _layouts Page Type”
“Content Page Type”
本文轉自 kaneb0y 51CTO部落格,原文連結:http://blog.51cto.com/kaneboy/281083,如需轉載請自行聯絡原作者


相關文章