最近在做我們單位的內部一個(gè)系統,使用了類(lèi)似于A(yíng)sp.Net 2.0里面的Theme(主題)的功能。此功能的核心是一個(gè)動(dòng)態(tài)的CSS定義,根據用戶(hù)選擇的不同主題內容來(lái)發(fā)送不同的CSS樣式文本。
本來(lái)這個(gè)問(wèn)題很好解決,在HTML中的<head>區內使用一個(gè):
<%#= base.GetCssInclude() %> 就可以解決,不過(guò)我沒(méi)有用這個(gè)辦法。
我注意了VS2005中Web應用程序項目模板里的Generic Handler 項,發(fā)現它是一個(gè).ashx文件,實(shí)際上它是一個(gè)HttpHandler。后來(lái)查了一下.Net SDK文檔,發(fā)現Asp.Net1.1也支持.ashx,但是沒(méi)有給出詳細內容。
我們都知道,HttpHandler是一個(gè)徹底自定義Http請求的方法,它通過(guò)web.config來(lái)定義Asp.Net運行時(shí)來(lái)過(guò)濾出要自定義的Http請求,發(fā)送到定義在web.config的指定類(lèi)中。
利用.ashx文件是一個(gè)更好的方法,這個(gè)文件類(lèi)似于.aspx文件,可以通過(guò)它來(lái)調用HttpHandler類(lèi),從而免去了普通.aspx頁(yè)面的控件解析以及頁(yè)面處理的過(guò)程。這個(gè)文件特別適合于生成動(dòng)態(tài)圖片,生成動(dòng)態(tài)文本等內容。
建立方法如下:
首先打開(kāi)一個(gè)Web項目,然后在任意目錄下使用VS2003解決方案資源管理器的“添加”-->“添加新項”,在對話(huà)框中選擇“文本文件”,然后在文件名處輸入“TextBuilder.ashx”。
然后在同目錄下,使用解決方案資源管理器,使用“添加”-->“添加類(lèi)”,在類(lèi)文件名處輸入“TextBuilder.ashx.cs”??梢钥闯?,它的文件命名規律與.aspx文件相同。
然后在.cs文件處輸入以下代碼(名稱(chēng)空間略):
- 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; }
- }
- }
using System.Webpublic 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è)類(lèi)的調用代碼:
<%@ WebHandler language="C#" Class="MyNamespace.TextBuilder" codebehind="TextBuilder.ashx.cs" %> 上面的代碼需要注意的是:必須在Class項中輸入類(lèi)的完整名稱(chēng),即包括名稱(chēng)空間及類(lèi)名稱(chēng)。
最后保存并編譯項目。
使用IE測試,輸入這個(gè).ashx的地址即可。
大家可以看出Response類(lèi)有個(gè)OutputStream方法,可以向客戶(hù)端輸出二進(jìn)制數據流,所以在我的項目中,使用這個(gè)方法,在一個(gè).ashx中使用DundasChart控件就可以生成非常好的統計圖,用它發(fā)送二進(jìn)制數據,方便快捷,而且不需在web.config內輸入任何配置代碼。
.ashx文件有個(gè)缺點(diǎn),他處理控件的回發(fā)事件非常麻煩,比如說(shuō)如果用它來(lái)生成DataGrid的列表也不是不行,但是處理數據的回發(fā),需要一些.aspx頁(yè)的功能,只有自己手動(dòng)處理這些功能。所以,一般使用.ashx,用來(lái)輸出一些不需要回發(fā)處理的項目即可。