一. 概述
新建一個ashx文件 代碼如下
<%@ WebHandler Language="C#" Class="TestHandler" %> using System; using System.Web; public class TestHandler : IHttpHandler { //dd public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; context.Response.Write("Hello World"); } //dd public bool IsReusable { get { return false; } } }
二. 解析
1).
<%@ WebHandler Language="C#" Class="TestHandler" %>
@WebHandler為ASP.NET頁面的一個指令 指定為Http handler文件(.ashx)定義屬性(Attribute)和編譯選項
屬性
Class 指定一個繼承自IHttpHandler的類,當handler被請求時將被實例化用來響應請求。這個屬性是必須的
CodeBehind 指定Class對應的文件,基本上沒用,主要是用來支持VS顯示的,可以去掉。
編譯選項
Debug 默認是false,所以非調試就不用打開,影響性能,可以省略
Description 關於當前handler的描述,ASP.NET解析時忽略,可能調試時能提供輔助信息,可以省略
Language 默認C# ,可以省略
WarningLevel 0-4 有默認值,可以省略。
2).
接下來是底下建立的類
實現了一個關鍵的接口:System.Web.IHttpHandler。實現它表明將以何種方式來處理來自外部的請求。
參數context是System.Web.HttpContext類型
context對象提供對用於為 HTTP 請求提供服務的內部服務器對象(如 Request、Response、
Session 和 Server)的引用,也即可以訪問我們的幾大服務器對象。
可以在ProcessRequest方法中編寫如何處理請求的細節
<%@ 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 + http://www.cnblogs.com/dongpo888/admin/file:////123.jpg); //將二進制數據寫入到輸出流中。 context.Response.OutputStream.Write(datas, 0, datas.Length); } public bool IsReusable { get { return false; } } }
而IsReusable表明其它的請求是否可以使用這個類的一個實例。
使用ashx的好處就是不需要在Web.Config中配置,就可以直接用IHttpHandler派生類來處理請求。
常見的應用場景:動態生成圖片(比如驗證碼),響應Ajax請求等。
三. aspx、ascx和ashx
可參考如下博客
點擊鏈接