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