雖然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 Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\Layouts”目錄中,不能被使用者進行定制。而Site Page是指位于一個SharePoint站點中的普通頁面。比如,站點的首頁:“http://sharepointsite/default.aspx”,或者位于一個文檔庫中的頁面:“http://sharepointsite/pages/xxx.aspx”,都是Site Page。
Application Page實際上和一個普通的ASP.NET頁面沒有任何差別。開發人員如果有需要,可以自己添加新的Application Page,你既可以在“Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE\Layouts”目錄中添加新的頁面,也可以在這個目錄下建立新的子目錄(或虛拟目錄),來放置你的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 Files\Common Files\Microsoft Shared\Web Server Extensions\12\TEMPLATE”的各個子目錄中),換言之,這個新站點的頁面其實是“不存在的”,它們隻是一個“标記”(這也就是在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參考:
<a href="http://msdn2.microsoft.com/en-us/library/aa979604.aspx">“Application _layouts Page Type”</a>
<a href="http://msdn2.microsoft.com/en-us/library/aa979501.aspx">“Content Page Type”</a>
本文轉自 kaneb0y 51CTO部落格,原文連結:http://blog.51cto.com/kaneboy/281083,如需轉載請自行聯系原作者