SharePointServer2007頁面模型
雖然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”
在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,如需轉載請自行聯絡原作者
相關文章
- ASP.NET 頁面物件模型 (轉)ASP.NET物件模型
- 學習和配置頁面轉換模型模型
- 【靜態頁面架構】CSS之盒子模型架構CSS模型
- 鴻蒙HarmonyOS實戰-Stage模型(開發卡片頁面)鴻蒙模型
- [BUG反饋]模型管理中刪除模型後頁面不重新整理模型
- [BUG反饋]非管理員不能訪問模型頁面模型
- js頁面跳轉的問題(跳轉到父頁面、最外層頁面、本頁面)JS
- router-view子頁面呼叫父頁面方法更新父頁面引數View
- VUE 單頁面應用 修改頁面titleVue
- web頁面Web
- 單頁面應用和多頁面應用
- WebForm 頁面ajax 請求後臺頁面 方法WebORM
- 頁面劫持,頁面劫持,如果被頁面劫持了該怎麼去解決,方法分享
- Flutter頁面保活及保持頁面跳轉位置Flutter
- mui 子頁面切換父頁面底部導航UI
- 前端頁面效能前端
- JQuery iframe頁面jQuery
- 頁面佈局
- 頁面增加CookieCookie
- 頁面元素大全
- webbrowser 控制 頁面Web
- 我的頁面
- ThinkPHP框架中自定義錯誤頁面和提示頁面PHP框架
- nginx 設定 404 500 頁面跳轉到指定頁面Nginx
- WordPress入門07-WordPress新建頁面和管理頁面
- Asp.Net中動態頁面轉靜態頁面ASP.NET
- 實現不同頁面不同頁首
- 如何讓頁面跳出框架在一個新頁面開啟框架
- Unix檔案系統頁面監控實現-效果頁面
- 頁面開啟很正常,後臺return後頁面偏左了
- web頁面引用相關檔案或者頁面方式彙總Web
- asp.net中一個頁面跳轉,後一個頁面操作內容後返回先前頁面,並使得先前頁面資料重新整理ASP.NET
- nginx解析php頁面NginxPHP
- NA嵌入Flutter頁面Flutter
- 頁面渲染:效能分析
- webpack 打包多頁面Web
- css頁面佈局CSS
- vue頁面跳轉Vue