ASP.NET 3.5核心編程學習筆記(45):HTTP處理常式之進階編程

來源:互聯網
上載者:User

  HTTP處理常式的使用者十分明確:改變某類資源的處理方式,並將其返回給使用者。我們可以通過處理常式基於運行時條件或某種形式的邏輯對傳統資源進行篩選,還可使HTTP處理常式以非同步方式來返回特定的頁面或資源。

  對於HTTP處理常式來說,註冊是一個關鍵步驟,它為ASP.NET提供有關處理常式的資訊。但我們都需要修改應用程式的web.config檔案,以便為ASP.NET應用程式提供處理常式的資訊。

  通過ASHX擴充和處理常式編程模型,我們可以避免修改web.config。部署新的HTTP處理常式只需要將對應的檔案複製到應用程式的某個檔案夾下即可。

以ASHX資源的形式處理常式

  ashx檔案包含一個特殊的指令@WebHandler,該指令用於表示HTTP處理常式端點與實現它的類之間的關係。所有ashx檔案必須以這樣的指令開頭:

<%@ WebHandler Language="C#" Class="Core35.Components.YourHandler" %>

  若ashx端點被調用,ASP.NET會解析該檔案的原始碼,並尋找@WebHandler指令指示的HTTP處理常式類。這個自動過程消除了更新web.config檔案的必要。

  下面給出一個ashx檔案的樣本:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler {

public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
}

public bool IsReusable {
get {
return false;
}
}

}

  注意,該類的原始碼可以以內聯形式編寫,也可以從應用程式引用的程式集中載入。

  ASP.NET會特別為ashx資源向IIS元庫中添加一個記錄,因而不必動手配置Web伺服器。

  帶有ashx副檔名的資源會由名為SimpleHandleFactory的HTTP處理常式工廠處理。它會尋找檔案頂部的@WebHandler指令,通過該指令找到HTTP處理常式類。

  為構建HTTP處理常式,我們可以將常規的類檔案編譯為程式集,也可以利用ashx資源。除ashx資源在首次請求時動態編譯外,這兩種試沒有顯著區別。

防止訪問被禁的資源

  如果不希望通過Web公開某種Web應用程式管理的資源,則必須通過IIS不返回那些資源檔。為此,可將該資源的請求交給aspnet_isapi,且將相應的副檔名映射到一個內建的處理常式,即HttpForbiddenHandler類:

<add verb="*" path="*.xyz" type="System.Web.HttpForbiddenHandler" />

  這樣,任何對.xyz資源的訪問都將顯示錯誤訊息。這個功能也適用於應用程式中某個具體的資源,如下所示:

<add verb="*" path="yourFile.txt" type="System.Web.HttpForbiddenHandler" />

如何判斷是否需要複用HTTP處理常式

  在一般的HTTP處理常式中,ProcessRequest要負責完成所有工作。IHttpHandler介面的IsReusabel屬性只應在非常特殊的情況下讓其返回true。如果該屬性為true,那麼在使用該處理常式過後,處理常式不會從記憶體中卸載,並反覆使用。也就是說,該屬性用於指示處理常式對象是否能被放入池中。

  在大多數情況下,該屬性返回true或false都沒有太大影響。如果該屬性為false,則要求為每個請求建立新的對象。簡單對象的建立不會造成大的系統開銷。如果處理常式初始化的代碼較高,則應該讓IsRusable屬性返回true以降低初始化的開銷。

  總的來說,除了要在並發環境下處理多個執行個體屬性,或某些屬性可能出問題,否則應讓IsResuable屬性返回true。

  何時使用處理常式的IsResuable屬性呢?答案是,僅當使用HTTP處理常式工廠時,該工廠會詢問處理常式,看它是否能為多個請求服務,進而選擇性的建立和維護處理常式池。

  ASP.NET頁面和ASHX資源都由各自的工廠控制建立。然而,這兩種工廠都不檢查IsReusable屬性。在ASP.NET平台內建的處理常式工廠中,很少有檢查程式IsReusable屬性的。這意味著,在建立AXD、ASHX或ASPX資源的HTTP處理常式時,無需為試圖找到最優的IsResuable屬性設定浪費時間。

  何時需要使用HTTP處理常式工廠呢?答案是,在不能確定選擇哪個HTTP處理常式類的情況下。例如,對於ASPX頁面,我們可能無法進一步獲該使用哪個類型的HTTP處理常式,該類型可能尚不存在(如果動態編譯)。這裡就需要HTTP處理常式工廠通過某種邏輯來決定使用哪個處理常式。也就是說,如果只聲明端點和類之間的綁定還不夠,則需要HTTP處理常式工廠來進一步判定使用哪個HTTP處理常式。

HTTP處理常式工廠

  HTTP請求可以與HTTP處理常式直接關聯,也可以與HTTP處理常式工廠對象關聯。HTTP處理常式工廠是實現IHttpHandlerFactory介面的類,負責返回實際處理請求的HTTP處理常式。

  在.NET Framework中,HTTP處理常式工廠用於在請求的資源傳給處理常式前,對其執行某些準備工作。如PageHandlerFactory負責處理aspx頁面,這個處理常式工廠不僅簡單返回相應的處理常式,如果需要,它還會從程式集中載入處理常式。

  HTTP處理常式工廠實現了IHttpHandlerFactory的兩個方法:GetHandler和ReleaseHandler,見下表:

  下面是一個簡單的HTTP處理常式工廠樣本,該工廠能夠基於不同的HTTP動作(GET或POST)返回請求的處理常式:

class MyHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler GetHandler(HttpContext context, string requestType, String url, String pathTranslated)
{
if(context.Request.RequestType.ToLower() == "get")
return (IHttpHandler)new MyGetHandler();
else if(context.Request.RequestType.ToLower() == "post")
return (IHttpHandler)new MyPostHandler();
return null;
}

public void ReleaseHandler(IHttpHandler handler)
{
// Nothing to do
}
}

  若要使用HTTP處理常式工廠,我們需要通過ASP.NET設定檔進行註冊。如果註冊某個處理常式,它會一直用於處理相應的請求。如果選擇工廠,我們便可以基於運行時條件動態決定哪個處理常式更適合特定的請求。此外,還可以通過處理常式的IsReusable屬性來實現處理常式池。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.