ASP中Server對象的功能,在ASP.NET中由HttpServerUtility類來實現。該類型的執行個體在AS.NET開始處理請求時建立,之後被儲存在請求上下文中。HttpServerUtility擁有大量輔助方法,通過HttpContext對象的Server屬性暴露給模組或處理常式(包括global.asax、頁面和Web服務)。
HttpServerUtility類的屬性
該類提供了兩個屬性:MachineName和ScriptTimeout。MachineName屬效能夠返回當前伺服器的電腦名稱。ScriptTimeout屬性擷取或設定處理請求佔用的最長時間(以秒為單位)。該屬性接受一個整數,預設值為90。若頁面在debug=true狀態下運行,該屬性會被設為趨於無窮大的值。
在動態建立的代表頁面的類中,ScriptTimeout屬性會自動在其建構函式顯式的設定。
HttpServerUtility類的方法
下表列出了HttpServerUtility類的所有方法:
HTML和URL編碼針對的是字元,旨在確保被傳送的文本不會被接收它的瀏覽器錯誤識別。具體來講,HTML編碼會將<、>、&和引號分別替換成等價的HTML實體,如<、>、&和"。該過程還會對空白、標點符號及HTML流中不允許出現的其他字元進行編碼。而URL編碼指在修正通過URL字串進行傳輸的文本。在URL編碼時,特殊字元也會被其他執行個體取代,但這些實體與HTML編碼所使用的不同。
自ASP.NET 2.0開始,該類又增添了兩個靜態方法,分別用於對token進行編碼和解碼。UrlTokenEncode方法接受包含Base64資料的位元組數組,能夠將其轉化為URL方式的編碼的標記。UrlTokenDecode能夠執行反向轉換過程。
嵌入其他頁面的結果
Execute方法允許我們將外部頁面作為子程式執行。當執行到Server.Execute後,控制權會被傳給指定的頁面。當前頁面的執行會被掛起,轉而啟用外部頁面。子頁面產生的響應文本會被捕獲,並根據所使用的Execute重載方法進行處理。下表列出了Execute方法的重載方法:
如果指定了TextWriter,那麼子頁面的響應文本會緩衝在該編寫器對象中,這樣可以自由管理首頁面的輸出。下例展示了這種效果--首頁面產生文本為粗體,而子頁面的輸出為普通字型,夾在首頁面的兩行輸出之間。
void Page_Load(object sender, EventArgs e)
{
StringBuilder builder = new StringBuilder();
builder.Append("<b>Response generated before Execute is called</b><hr/>");
StringWriter writer = new StringWriter();
Server.Execute("child.aspx", writer);
builder.Append(writer.ToString());
builder.Append("<hr/><b>Response generated after the call to Execute.<b>");
Label1.Text = builder.ToString();
}
Execute方法的內部實現頗為有趣。首頁面和子頁面由同一個HttpApplication對象運行,好像它們處理的是同一個請求。Execute的工作原理是一種環境切換。首先,該方法會從應用程式工廠擷取一個HTTP處理常式,以便為新請求服務。主請求的原始處理常式會被緩衝,新的處理常式會取代它。子頁面繼承其父頁面的上下文,執行完畢後,會Session和Application的任何更改會立即對首頁面生效。
由於處理常式的切換不需要建立處理請求的新對象,因而整個操作極為高效。當子頁面返回後,原始的處理常式會被恢複。首頁面的執行會從其暫停位置繼續執行,但使用的上下文是繼承於子頁面的。
ASP.NET會直接調用Execute方法指示的處理常式,而不會應用任何身分識別驗證與制空權邏輯。如果您的安全性原則要求用戶端擁有訪問該資源的許可權,那麼應用程式應重新進行授權。我們可用Response.Redirect來替代Execute,從而強制進行重新授權。若Redirect被調用,瀏覽器會向系統發出新的請求,這通常由IIS和ASP.NET進行身分識別驗證和授權。另一種方法是通過定義角色並在應用程式調用Execute方法前檢查使用者角色,以此來驗證使用者是否有許可權調用子頁面。
伺服器端重新導向
Transfer方法與Execute方法的區別在於,Transfer方法在執行完指定頁面後,會終止主調頁面的執行。新頁面的執行效果如果最初請求的頁面。Transfer方法有以下3個重載方法:
public void Transfer(string);
public void Transfer(string, bool);
public void Transfer(IHttpHandler, bool);
string類型的參數用於指定目標URL。bool型別參數用於指定QueryString和Form的處理方式--如果為true,這兩個集合會被保留,否則都被清除。IHttpHandler型別參數可直接指定要調用的HTTP處理常式。