ASP.NET應(yīng)用程序的web.config文件
ASP.NET不是asp的簡(jiǎn)單升級(jí),而是微軟。Net計(jì)劃中的一個(gè)重要組成部分,它依托。Net的多語(yǔ)言與強(qiáng)大的類(lèi)庫(kù)支持,引進(jìn)了服務(wù)端 HTML控件與WEB控件,自動(dòng)處理控件的客戶端與服務(wù)端的 交互,為開(kāi)發(fā)人員提供了類(lèi)似Windows下窗口編程的界面,為開(kāi)發(fā)大型網(wǎng)絡(luò)應(yīng)用程序功能提 供了良好的編程接口,也能夠極大地提高開(kāi)發(fā)人員的工作效率。
然而,"一次轉(zhuǎn)換,兩次編譯"過(guò)程使得aspx文件在***執(zhí)行(或更新后***運(yùn)行)時(shí)顯得略有不足,特別是在擁有大量aspx及codebehind的代碼文件的應(yīng)用環(huán)境中,把a(bǔ)spx文件編譯成DLL(在。Net中,被稱(chēng)為應(yīng)用程序集)后再發(fā)布,省去"一次轉(zhuǎn)換、一次編譯"的時(shí)間及CPU占用率,對(duì)提高WEB服務(wù)的整體性能會(huì)有較大的提升。當(dāng)然,編譯成DLL后,對(duì)源代碼的保密性也有一定程度的提高。
本文通過(guò)對(duì)ASP.NET的基本處理流程及一個(gè)偶然發(fā)現(xiàn)的秘密的分析,介紹了在ASP.NET中 如何建立aspx到DLL的映射,如何開(kāi)發(fā)一個(gè)可以處理HTTP請(qǐng)求/響應(yīng)的DLL,以及如何設(shè)置"陷阱",把現(xiàn)成的單個(gè)aspx文件與 codebehind的aspx文件編譯成DLL的過(guò)程,文章***,還介紹了一個(gè)在實(shí)際操作過(guò)程的小技巧。
由于本文要涉及ASP.NET應(yīng)用程序,web.config文件等,為了使讀者能更好地理解本文內(nèi)容,也為了使本文看上去不顯累贅,先就本文相對(duì)應(yīng)的系統(tǒng)環(huán)境作一介紹:
系統(tǒng)環(huán)境:Win2000(SP3)+ IIS5 + .Net Framework 1.0(中文版)。
服務(wù)器名稱(chēng):由于本文的例子均在本機(jī)上測(cè)試,服務(wù)器名稱(chēng)為localhost.
IIS設(shè)置:建立虛擬目錄dlltest(真實(shí)路徑為w:\wwwroot\dlltest),并把它設(shè)為應(yīng)用程序,在dlltest下建立bin目錄。所有源文件將放在dlltest目錄下,而所有dll文件將放在dlltest\bin目錄下。
ASP.NET應(yīng)用程序配置文件——web.config在dlltest目錄下建立一個(gè)web.config文件,初始時(shí)該文件內(nèi)容如下:
- <?xml version="1.0"?>
- <configuration>
- <system.web />
- </configuration>
命令窗口(DOS窗口)
打開(kāi)命令窗口,并用cd命令使當(dāng)前目錄為w:\wwwroot\dlltest.
建立aspx到dll的映射
首先讓我們來(lái)看看一般情況下aspx文件是如何被ASP.NET處理的:
當(dāng)一個(gè)HTTP請(qǐng)求(例如"http://webserver/webapp/webpage.aspx") 從客戶端發(fā)送到IIS服務(wù)器時(shí),IIS捕獲并分析這個(gè)請(qǐng)求,
◆當(dāng)它分析到這個(gè)請(qǐng)求是一個(gè)aspx頁(yè)面時(shí),立即以 "/webapp/webpage.aspx"為參數(shù)調(diào)用ASP.NET運(yùn)行環(huán)境(aspnet_wp.exe),
◆ASP.NET環(huán)境啟動(dòng)后,檢查 "/webapp/webpage.aspx"是否存在,若不存在,則向客戶端返回HTTP 404(File not found)錯(cuò)誤,
◆否則在 ASP.NET 的臨時(shí)目錄中查找相應(yīng)的dll文件,若不存在或者該dll比aspx源文件"舊",則調(diào)用csc編譯器(若aspx的服務(wù)端腳本語(yǔ)言是 VB或JScript,則調(diào)用相應(yīng)的vbc編譯器, jsc編譯器)把a(bǔ)spx文件編譯成dll,
◆然后ASP.NET再調(diào)用該dll來(lái)處理具體的客戶請(qǐng) 求,返回服務(wù)器響應(yīng)。
從這個(gè)處理流程可以看出,一般情況下,ASP.NET運(yùn)行環(huán)境會(huì)自動(dòng)識(shí)別、檢查、更新與aspx相對(duì)應(yīng)的 dll.那么有沒(méi)有其它辦法可以強(qiáng)制把對(duì)一個(gè)aspx文件的處理"路由"到一個(gè)已編譯存在的DLL呢?方法就是在ASP.NET應(yīng)用程序配置文件 web.config的system.web節(jié)的httpHandlers節(jié)添加aspx到dll的映射項(xiàng),語(yǔ)法如下:
- <add verb="*" path="aspx文件名" type="類(lèi)名,dll文件" />
aspx文件:需要被"路由"的虛擬名稱(chēng),擴(kuò)展名必須是aspx,否則IIS會(huì)先于ASP.NET運(yùn)行環(huán)境處理該文件。
dll文件: dll文件(應(yīng)用程序集)的名稱(chēng),不必輸入".dll".ASP.NET 首先在應(yīng)用程序的專(zhuān)用 \bin 目錄中搜索程序集 DLL,然后在系統(tǒng)程序集緩存中搜索程序集 DLL.
類(lèi)名: 由于一個(gè)dll可能會(huì)有多個(gè)名稱(chēng)空間或多個(gè)類(lèi),因此必須指明當(dāng)dll調(diào)用時(shí)自動(dòng)加載哪個(gè)類(lèi)。
例如,某一ASP.NET應(yīng)用程序的web.config文件如下:
- <?xml version="1.0"?>
- <configuration>
- <system.web>
- <httpHandlers>
- <add verb="*" path="index.aspx" type="BBS.IndexPage, bbs" />
- </httpHandlers>
- </system.web>
- </configuration>
該配置文件告訴ASP.NET,在客戶端請(qǐng)求本應(yīng)用程序的index.aspx文件時(shí),直接調(diào)用應(yīng)用程序bin目錄下的bbs.dll,并自動(dòng)加載其中的BBS.IndexPage類(lèi)。