.ashx 文件用于寫web handler的。當(dāng)然你完全可以用.aspx 的文件后綴。使用.ashx 可以讓你專注于編程而不用管相關(guān)的WEB技術(shù)。.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應(yīng)用程序項目模板里的Generic Handler 項,發(fā)現(xiàn)它是一個.ashx文件,實際上它是一個HttpHandler。后來查了一下.Net SDK文檔,發(fā)現(xiàn)Asp.Net1.1也支持.ashx,但是沒有給出詳細(xì)內(nèi)容。
我們都知道,HttpHandler是一個徹底自定義Http請求的方法,它通過web.config來定義Asp.Net運行時來過濾出要自定義的Http請求,發(fā)送到定義在web.config的指定類中。
利用.ashx文件是一個更好的方法,這個文件類似于.aspx文件,可以通過它來調(diào)用HttpHandler類,從而免去了普通.aspx頁面的控件解析以及頁面處理的過程。這個文件特別適合于生成動態(tài)圖片,生成動態(tài)文本等內(nèi)容。
建立方法如下:
首先打開一個Web項目,然后在任意目錄下使用VS2003解決方案資源管理器的“添加”-->“添加新項”,在對話框中選擇“文本文件”,然后在文件名處輸入“TextBuilder.ashx”。
然后在同目錄下,使用解決方案資源管理器,使用“添加”-->“添加類”,在類文件名處輸入“TextBuilder.ashx.cs”。可以看出,它的文件命名規(guī)律與.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”文件的第一行處輸入上面這個類的調(diào)用代碼:
<%@ WebHandler language="C#" Class="MyNamespace.TextBuilder" codebehind="TextBuilder.ashx.cs" %> 上面的代碼需要注意的是:必須在Class項中輸入類的完整名稱,即包括名稱空間及類名稱。
最后保存并編譯項目。
使用IE測試,輸入這個.ashx的地址即可。
大家可以看出Response類有個OutputStream方法,可以向客戶端輸出二進(jìn)制數(shù)據(jù)流,所以在我的項目中,使用這個方法,在一個.ashx中使用DundasChart控件就可以生成非常好的統(tǒng)計圖,用它發(fā)送二進(jìn)制數(shù)據(jù),方便快捷,而且不需在web.config內(nèi)輸入任何配置代碼。
.ashx文件有個缺點,他處理控件的回發(fā)事件非常麻煩,比如說如果用它來生成DataGrid的列表也不是不行,但是處理數(shù)據(jù)的回發(fā),需要一些.aspx頁的功能,只有自己手動處理這些功能。所以,一般使用.ashx,用來輸出一些不需要回發(fā)處理的項目即可。
利用“一般處理程序”。如果你實用的是vs2005你在添加新項中可以見到“一般處理程序”,它的后綴名為.ashx。它是什么?其實它和.aspx很類似。先問問.aspx是如何工作的?也許你知道,.aspx能處理來自外部傳入的請求,然后它還能處理這個請求并生成一個html作為結(jié)果返回。這是典型的處理外部請求的方式。.aspx就是專門為處理“典型”的請求而出現(xiàn)的。那么如果我們現(xiàn)在需要一種又能處理外部請求又需要我們自定義的處理這個請求那又要怎么做呢?(也就是不實用“典型”的方式來處理)。.ashx就能幫你做到這一點。
首先你發(fā)現(xiàn) <%@ WebHandler Language="C#" Class="ImageHandler" %>這句話。想想一個ASP.NET的頁面是不是也有類似的東西。其實它表明了現(xiàn)在的這個文件可以處理一個來自外部的請求。當(dāng)然就它是不行的。
接下來關(guān)鍵的東西就是底下建立的類,它實現(xiàn)了一個關(guān)鍵的接口:IHttpHandler。實現(xiàn)這個接口表明你現(xiàn)在將以何種方式來處理來自外部的請求。其中有一個方法和屬性需要實現(xiàn),你可以在ProcessRequest方法中編寫如何處理請求的細(xì)節(jié)而IsReusable表明其它的請求是否可以使用這個類的一個實例。我們可以暫時忽略IsReusable屬性。將焦點轉(zhuǎn)到ProcessRequest方法上。在ProcessRequest中有一個參數(shù)context它是一個HttpContext類型,context對象提供對用于為 HTTP 請求提供服務(wù)的內(nèi)部服務(wù)器對象(如 Request、Response、Session 和 Server)的引用。也就是可以訪問我們的幾大服務(wù)器對象。
現(xiàn)在來看個簡單的例子。
請在你自己建立的WEB站點文件夾中隨便放一個圖片。我的想法是這樣,我先將一個圖片讀取成一個二進(jìn)制的數(shù)據(jù)然后在將這個二進(jìn)制的數(shù)據(jù)轉(zhuǎn)變成一個圖片。這其中需要你建立兩個文件。一個.ASPX文件和現(xiàn)在我們要實用的.ASHX文件。
文件ImageHandler.ashx
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.Web;
/// <summary>
/// 這就一個沒有任何實現(xiàn)的一般處理程序。
/// </summary>public class ImageHandler : IHttpHandler {
public void ProcessRequest (HttpContext context)
{
//獲取虛擬目錄的物理路徑。
string path = context.Server.MapPath("");
//獲取圖片文件的二進(jìn)制數(shù)據(jù)。
byte[] datas = System.IO.File.ReadAllBytes(path + "\\U1513.jpg");
//將二進(jìn)制數(shù)據(jù)寫入到輸出流中。
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文件。
它一般用于產(chǎn)生供瀏覽器處理的、不需要回發(fā)處理的數(shù)據(jù)格式,例如用于生成動態(tài)圖片、動態(tài)文本、ajax檢測用戶名是否可用(ajax其實都適合)等內(nèi)容。
.ashx初建會有起始代碼,其中ContentType用于設(shè)置程序的輸出類型,這段代碼可以在頁面上出處一段文本“Hello World”其次ashx文件是可以直接訪問的。
注意:
實現(xiàn)HttpHandler得功能就必須實現(xiàn)IHttpHandler接口,而且,任何實現(xiàn)了該接口的類都可以用于處理輸入的HTTP請求。
從上面的代碼我們可以看到,實現(xiàn)該接口需要實現(xiàn)IsReusable屬性和ProcessRequest方法。IsReusable可以用來設(shè)置是否可以重用此實例。
ProcessRequest方法是整個HTTP請求最終的處理方法。就是該文件的程序入口點,你可以在這個函數(shù)里面處理請求內(nèi)容,并返回以及其他邏輯。