某客戶最近和找到我說“我們需要對某些 ASP.NET 頁面進行更改。您能幫忙嗎?”就像任何其他顧問一樣,我馬上答道“當然,告訴我具體情況吧。”但除了這些頁面的 URL,該客戶實際上幾乎什麼都沒提供。不管怎樣,該客戶就是要修改一些 ASP.NET 頁面,卻沒有源代碼。一開始,我覺得這只是個問題而已,但隨著與該客戶交談的深入,我愈發覺得這是一個有趣的挑戰。
如果不給您按鈕的源代碼來創建派生類,也不給您 ASP.NET 頁面的源代碼來修改其行為,則在 Windows 編程中,通常要關聯底層消息並子類化窗口。在 ASP.NET 中,則可以嘗試關聯頁面事件以便重寫頁面行為並輸出。
經過一番周密思考,我總結出了一些實際情形,在這些情形中,可能需要在不改動源代碼的情況下修改 ASP.NET 頁面的運行時行為。我還找到了許多可以完成這項任務的方法。在本文(共兩部分)中,我將介紹這些方法以及如何僅通過只讀訪問甚至根本不訪問源代碼來更改 ASP.NET 頁面的用戶界面和行為。
可能的情形
假定某組用戶在運行某 Web 應用程序的一個個性化版本,並且該應用程序需要一些遠程調試或分析。您不能中斷服務,但仍需要了解發生的情況。有了性能計數器和內置的跟蹤功能可能還不夠。所部署的 ASP.NET 頁面有可能根本沒有包含或啟用跟蹤指令。在這種情況下,您需要進行遠程干預,注入跟蹤代碼,這是最基本的要求。
還有一種情形,就是需要臨時更改多種頁面。對於單個頁面,您只需創建舊頁面的一個副本並替換它即可。不過,更新多個頁面可能就比較困難了,並且維護工作也可能及其復雜。
第三種情形,就是企業策略禁止對源代碼進行寫操作。在這種情況下,源代碼可讀,但不可修改。不過,您可以向站點添加擴展。
最後一種情形,也是最復雜並且我真的遇到過的一種情形,即公司運行的 Web 應用程序的源代碼由於某種原因不再可用。
可以看出,需要在不訪問源代碼的情況下修改頁面的運行時行為的情形非常多。那麼接下來該怎麼辦呢?
可行的方法
有許多方法可以在不接觸源代碼的情況下修改正在運行的 ASP.NET 頁面。圖 1 列出了幾種方法。不是所有的方法在任何情形下都有效,而且有些方法可以一起使用。有的方法可能需要編寫新的 HTTP 模塊或 HTTP 處理程序,有的方法則可能要求對 web.config 文件進行更改。大多數情況下都需要重新啟動應用程序。實際上,如果更改 web.config 或 global.asax 文件,或添加到 Bin 文件夾或 App_Code 文件夾,就會自動重新啟動應用程序。
Figure 1 在不訪問源代碼的情況下修改頁面
方法 實現 訪問控件樹 HTTP 模塊 修改頁面基類 web.config 控件替換 web.config 構建提供程序 程序集 重定向頁面 HTTP 處理程序 重寫頁面 HTTP 處理程序或 URL 重寫