一. 概述
新建一个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;////// 这就一个没有任何实现的一般处理程序。/// public class ImageHandler : IHttpHandler { public void ProcessRequest (HttpContext context) { //获取虚拟目录的物理路径。 string path = context.Server.MapPath(""); //获取图片文件的二进制数据。 byte[] datas = System.IO.File.ReadAllBytes(path + //将二进制数据写入到输出流中。 context.Response.OutputStream.Write(datas, 0, datas.Length); } public bool IsReusable { get { return false; } }}
而IsReusable表明其它的请求是否可以使用这个类的一个实例。
使用ashx的好处就是不需要在Web.Config中配置,就可以直接用IHttpHandler派生类来处理请求。
常见的应用场景:动态生成图片(比如验证码),响应Ajax请求等。
三. aspx、ascx和ashx
可参考如下博客
点击