ASP.NET HTTP模組和處理常式(3)
來源:互聯網
上載者:User
ASP.NET運行時對HTTP處理常式的使用方式
無論你是否相信,ASP.NET都使用HTTP請求實現了大量的自己的功能。ASP.NET使用處理常式來處理.aspx、 .asmx、 .soap和其它ASP.NET檔案。
下面是machine.config檔案中的一個片段:
<httpHandlers>
<add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
<add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/>
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
. . . . . .
. . . . . .
</httpHandlers>
在上面的配置資訊中你可以看到對.aspx檔案的所有請求都由System.Web.UI.PageHandlerFactory類來處理。與此類似,對.config檔案和其它檔案(它們不能被用戶端直接存取)的所有請求都由System.Web.HttpForbiddenHandler類處理。你可能已經猜到,當訪問這些檔案的時候,該類簡單地給用戶端返回一個錯誤資訊。
執行HTTP處理常式
現在你將看到如何?一個HTTP處理常式。那麼我們的新處理常式要做什麼任務呢?前面我提到,處理常式大多數用於給Web伺服器添加新功能;因此,我將建立一個處理常式來處理新的檔案類型——副檔名為.15seconds的檔案。我們建立了這個處理常式並在我們的Web應用程式的web.config檔案中註冊之後,所有對.15seconds檔案的請求都將由這個新處理常式來處理。
你可能正在考慮這個處理常式的使用方法。如果你希望引入一種新的伺服器指令碼語言或動態伺服器檔案(例如asp、aspx)該怎麼辦呢?你可以為它編寫一個自己的處理常式。類似地,如果你希望在IIS上運行Java小程式、JSP和其它一些伺服器端Java組件應該怎麼辦呢?一種方法是安裝某些ISAPI擴充(例如Allaire或Macromedia Jrun)。你也可以編寫自己的HTTP處理常式。儘管這對於第三方廠商(例如Allaire和Macromedia)來說是很複雜的事務,但是它卻是個很有吸引力的選擇,因為它們的HTTP處理能夠能夠訪問ASP.NET運行時暴露的所有新功能。
實現我們的HTTP處理常式包含以下步驟:
1.編寫一個實現IHttpHandler介面的類。
2. 在web.config或machine.config檔案中註冊這個處理常式。
3.在Internet服務管理員中把檔案擴充(.15seconds)映射到ASP.NET ISAPI擴充DLL(aspnet_isapi.dll)上。
第一步
在Visual Studio.NET中建立一個新的C#類庫項目,並把它命名為“MyHandler”。Visual Studio.NET將自動地給項目添加一個叫做“Class1.cs”的類。把它改名為“NewHandler”;在代碼視窗中開啟這個類,並把類的名稱和建構函式的名稱改成“NewHandler”。
下面是NewHandler類的代碼:
using System;
using System.Web;
namespace MyHandler
{
public class NewHandler : IHttpHandler
{
public NewHandler()
{
// TODO: 此處添加構造邏輯
}
#region Implementation of IHttpHandler
public void ProcessRequest(System.Web.HttpContext context)
{
HttpResponse objResponse = context.Response ;
objResponse.Write("<html><body><h1>Hello 15Seconds Reader ") ;
objResponse.Write("</body></html>") ;
}
public bool IsReusable
{
get
{
return true;
}
}
#endregion
}
}
你在ProcessRequest方法中可以看到,該HTTP處理常式通過System.Web.HttpContext對象訪問了所有作為參數傳遞給它的ASP.NET內部對象。實現ProcessRequest方法只需要簡單地從context對象中提取HttpResponse對象並把發送一些HTML給用戶端。類似地,IsReusable返回true,表明這個處理常式可以被重複用作處理其它的HTTP請求。
我們編譯上面的代碼並把它放到webapp虛擬目錄的bin目錄之中。
第二步
在web.config檔案中通過添加下面的文本來註冊這個處理常式:
<httpHandlers>
<add verb="*" path="*.15seconds" type="MyHandler.NewHandler,MyHandler"/>
</httpHandlers>
第三步
由於我們已經建立了用於處理新擴充檔案的處理常式了,我們還需要把這個副檔名告訴IIS並把它映射到ASP.NET。如果你不執行這個步驟而試圖訪問Hello.15seconds檔案,IIS將簡單地返回該檔案而不是把它傳遞給ASP.NET運行時。其結果是該HTTP處理常式不會被調用。
運行Internet服務管理員,右鍵點擊預設Web網站,選擇屬性,移動到Home目錄選項頁,並點擊配置按鈕。應用程式配置對話方塊彈出來了。點擊添加按鈕並在可執列欄位輸入aspnet_isapi.dll檔案路徑,在擴充欄位輸入.15seconds。其它欄位不用處理;該對話方塊如下所示:
點擊確認按鈕關閉應用程式配置和預設Web網站屬性對話方塊。
現在我們運行Internet Explorer並輸入url:http://localhost/webapp/hello.15seconds,看到的頁面如下: