.ashx 檔案用於寫web handler的。其實就是帶HTML和C#的混合檔案。當然你完全可以用.aspx 的檔案尾碼。使用
.ashx 可以讓你專註於編程而不用管相關的WEB技術。
.ashx必須包含IsReusable. 如下例所示
<% @ webhandler language="C#" class="AverageHandler" %>
using System;
using System.Web;
public class AverageHandler : IHttpHandler
{
public bool IsReusable
{ get { return true; } }
public void ProcessRequest(HttpContext ctx)
{
ctx.Response.Write("hello");
}
}
.ashx比.aspx的好處在與不用多一個html
注意了VS2005中Web應用程式項目模板裡的Generic Handler 項,發現它是一個.ashx檔案,實際上它是一個HttpHandler。後來查了一下.Net SDK文檔,發現Asp.Net1.1也支援.ashx,但是沒有給出詳細內容。
我們都知道,HttpHandler是一個徹底自訂Http請求的方法,它通過web.config來定義Asp.Net運行時來過濾出要自訂的Http請求,發送到定義在web.config的指定類中。
利用.ashx檔案是一個更好的方法,這個檔案類似於.aspx檔案,可以通過它來調用HttpHandler類,從而免去了普通.aspx頁面的控制項解析以及頁面處理的過程。這個檔案特別適合於產生動態圖片,產生動態文本等內容。
建立方法如下:
首先開啟一個Web項目,然後在任意目錄下使用VS2003方案總管的“添加”-->“添加新項”,在對話方塊中選擇“文字檔”,然後在檔案名稱處輸入“TextBuilder.ashx”。
然後在同目錄下,使用方案總管,使用“添加”-->“添加類”,在類檔案名稱處輸入“TextBuilder.ashx.cs”。可以看出,它的檔案命名規律與.aspx檔案相同。
然後在.cs檔案處輸入以下代碼(名稱空間略): using System.Web
public sealed class TextBuilder : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ClearContent();
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World");
context.Response.End();
}
public bool IsReusable
{
get { return true; }
}
}
然後在“TextBuilder.ashx”檔案的第一行處輸入上面這個類的調用代碼: <%@ WebHandler language="C#" Class="MyNamespace.TextBuilder" codebehind="TextBuilder.ashx.cs" %>
上面的代碼需要注意的是:必須在Class項中輸入類的完整名稱,即包括名稱空間及類名稱。
最後儲存並編譯項目。
使用IE測試,輸入這個.ashx的地址即可。
大家可以看出Response類有個OutputStream方法,可以向用戶端輸出位元據流,所以在我的項目中,使用這個方法,在一個.ashx中使用DundasChart控制項就可以產生非常好的統計圖,用它發送位元據,方便快捷,而且不需在web.config內輸入任何配置代碼。
.ashx檔案有個缺點,他處理控制項的回傳事件非常麻煩,比如說如果用它來產生DataGrid的列表也不是不行,但是處理資料的回傳,需要一些.aspx頁的功能,只有自己手動處理這些功能。所以,一般使用.ashx,用來輸出一些不需要回傳處理的項目即可。
利用“一般處理常式”。如果你實用的是vs2005你在添加新項中可以見到“一般處理常式”,它的尾碼名為.ashx。它是什嗎?其實它和.aspx很類似。先問問.aspx是如何工作的?也許你知道,.aspx能處理來自外部傳入的請求,然後它還能處理這個請求並產生一個html作為結果返回。這是典型的處理外部請求的方式。.aspx就是專門為處理“典型”的請求而出現的。那麼如果我們現在需要一種又能處理外部請求又需要我們自訂的處理這個請求那又要怎麼做呢?(也就是不實用“典型”的方式來處理)。.ashx就能幫你做到這一點。
首先你發現 <%@ WebHandler Language="C#" Class="ImageHandler" %>這句話。想想一個ASP.NET的頁面是不是也有類似的東西。其實它表明了現在的這個檔案可以處理一個來自外部的請求。當然就它是不行的。
接下來關鍵的東西就是底下建立的類,它實現了一個關鍵的介面:IHttpHandler。實現這個介面表明你現在將以何種方式來處理來自外部的請求。其中有一個方法和屬性需要實現,你可以在ProcessRequest方法中編寫如何處理請求的細節而IsReusable表明其它的請求是否可以使用這個類的一個執行個體。我們可以暫時忽略IsReusable屬性。將焦點轉到ProcessRequest方法上。在ProcessRequest中有一個參數context它是一個HttpContext類型,context對象提供對用於為 HTTP 要求提供服務的內部伺服器對象(如 Request、Response、Session 和 Server)的引用。也就是可以訪問我們的幾大伺服器對象。
現在來看個簡單的例子。
請在你自己建立的WEB網站資料夾中隨便放一個圖片。我的想法是這樣,我先將一個圖片讀取成一個二進位的資料然後在將這個二進位的資料轉變成一個圖片。這其中需要你建立兩個檔案。一個.ASPX檔案和現在我們要實用的.ASHX檔案。
檔案ImageHandler.ashx
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.Web;
/// <summary>
/// 這就一個沒有任何實現的一般處理常式。
/// </summary>
public class ImageHandler : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
//擷取虛擬目錄的實體路徑。
string path = context.Server.MapPath("");
//擷取圖片檔案的位元據。
byte[] datas = System.IO.File.ReadAllBytes(path + "\\U1513.jpg");
//將位元據寫入到輸出資料流中。
context.Response.OutputStream.Write(datas, 0, datas.Length);
}
public bool IsReusable {
get {
return false;
}
}
}
default.aspx檔案
注意上面的代碼:<asp:Image ID="Image1" runat="server" ImageUrl="~/ImageHandler.ashx"/></div> 中ImageUrl指向的是ImageHandler.ashx檔案。