一. 概述

新建一个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

aspx,ascx和ashx使用小结

做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有很多文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面自己总结一下做个笔记。
1、.aspx
Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。
2、.ascx
asp.net的用户控件,是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不允许Web客户端通过url来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。
3、.ashx 
前面两个都太熟悉了,这个才是要讲的重点。
(1)、使用举例
.ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口.
一个简单的实现修改登录用户密码的示例:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.SessionState; namespace Test
{     public class HandlerTest : IHttpHandler, IRequiresSessionState
    {         public void ProcessRequest(HttpContext context)
        {
            context.Response.ClearContent();
            context.Response.ContentType = "text/plain";
            context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //无缓存             string action = context.Request.Params["action"]; //外部请求
            if (action == "modifyPwd") //用户改密码
            {
                string oldPwd = context.Request.Params["pwd"];                 //在ashx文件用使用Session必须实现IRequiresSessionState接口
                //Session["LogedUser"]是登录用户的会话,用户名和密码都是test
                if (oldPwd.ToUpper() != ((context.Session["LogedUser"]) as Customer).Password.ToUpper()) //用户输入的旧密码和当前登录用户的不相同
                {
                    context.Response.Write("旧密码输入错误!");
                }
                else
                {
                    context.Response.Write("旧密码输入正确!");
                }
            }             context.Response.End();
        }         public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

客户端的调用(js和页面部分):

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ASHXTest.aspx.cs" Inherits="ASHXTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>mytest</title>
    <script type="text/javascript">
        function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }         function createXMLHTTP() {
            var xmlHttp = false;
            var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
                         "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
                         "Microsoft.XMLHTTP"];
            for (var i = 0; i < arrSignatures.length; i++) {
                try {
                    xmlHttp = new ActiveXObject(arrSignatures[i]);
                    return xmlHttp;
                }
                catch (oError) {
                    xmlHttp = false; //ignore
                }
            }
            // throw new Error("MSXML is not installed on your system."); 
            if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
                xmlHttp = new XMLHttpRequest();
            }
            return xmlHttp;
        }         var xmlReq = createXMLHTTP();         // 发送ajax处理请求(这里简单验证旧密码的有效性)
        function validateOldPwd(oTxt) {
            var url = "/HandlerTest.ashx?action=modifyPwd&pwd=" + escape(oTxt.value); //.ashx文件
            xmlReq.open("get", url, true);
            xmlReq.setRequestHeader("If-Modified-Since", "0");
            xmlReq.onreadystatechange = callBack;
            xmlReq.send(url); // 发送文本
        }         function callBack() {
            if (xmlReq.readyState == 4) {
                if (xmlReq.status == 200) {
                    alert(xmlReq.responseText); // 接收文本
                }
                else if (xmlReq.status == 404) {
                    alert("Requested URL is not found.");
                } else if (xmlReq.status == 403) {
                    alert("Access denied.");
                } else
                    alert("status is " + xmlReq.status);
            }
        }     </script> </head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="txtOldPwd" type="text" onblur="validateOldPwd(this)" />
    </div>
    </form>
</body>
</html>

分析:
a、以前我们通常都是通过一个简单的aspx文件实现的功能,其实通过ashx也可以。
笔者曾经写过的一篇ajax:数据传输方式简介 ,通过对比,我们发现aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理;而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.比aspx少处理了html的过程(但是ashx也可以处理html的一些逻辑,只是通常都不这么用)。理论上ashx比aspx要快。
b、还是在相同的旧文里,我们知道数据传输的几种方式,其实ashx都可以实现(修改ashx文件里context.Response.ContentType 即可),这里不再赘述了。
(2)、ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。 
(3)、.ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。 
4、总结
aspx-->P(Page)
ascx-->C(Control)
ashx-->H(HttpHandler)

当浏览器访问web服务器,我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签,在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来"变相"解释html的,说白了它就是为了提高生产率,它的技术术语再多,本质上还是html范畴内的东西(如果你不通过那些动态页面技术完全利用html和浏览器(当然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也相当可观).所以说web开发的底层就是一堆的html标签,无论是asp.net还是jsp都是对html某种方式的包装,是html的产物。

ASP.NET运行机制之一般处理程序(ashx)的更多相关文章

  1. 对ASP.NET运行机制之 一般处理程序ashx的学习

    一般处理程序(HttpHandler)是·NET众多web组件的一种,ashx是其扩展名.其中一个httpHandler接受并处理一个http请求,类比于Java中的servlet.类比于在Java中 ...

  2. ASP.NET运行机制原理

    ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...

  3. ASP.NET运行机制原理 ---浏览器与IIS的交互过程 自己学习 网上查了下别人写的总结的很好 就转过来了 和自己写的还好里嘻嘻

    一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问 ...

  4. WebForm页面生命周期及asp.net运行机制

    1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...

  5. ASP.NET 运行机制

    原本今天打算继续写ASP.NET MVC第四天的.但是由于里面涉及到asp.net运行机制的原理,如果不分析一下这里,mvc想说清楚还是挺困难的.既然要提到asp.net运行机制,所以打算还是说详细一 ...

  6. 了解认识asp.net运行机制

    asp.net  运行机制 下面了解认识httpModule 要创建一个httpModule类 using System;using System.Collections.Generic;using ...

  7. ASP.NET 运行机制续(完结)

    上一篇说到applicationInstance会执行一些列的事件.下面是我在msdn上找到有关asp.net程序生命周期相关的描述及图片 声明周期的起始 ASP.NET 应用程序的生命周期以浏览器向 ...

  8. 我对asp.net运行机制的理解

    有一本书叫<asp.net 本质论>,作者名叫冠军.我看了几次,都没有坚持看下来.这次连续看完了前三章,然后参考网上的资料,总结下我对.net运行机制的理解. 先上两张图: 看着这两张图, ...

  9. ASP.NET 运行机制详解

    1.浏览器和服务器的交互原理 通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去访问一台电脑上访问文件一样,只不过浏览器的访问请求是由被访问的电脑上的一个 WEB服务器软件来接收处理, ...

随机推荐

  1. SHOW SLAVE STATUS几个常见参数

    --显示当前读取的Master节点二进制日志文件和文件位置,对应线程I/O thread Master_Log_File: mysql-bin.000011 Read_Master_Log_Pos: ...

  2. python 数据类型(sequence 序列、dictionary 词典、动态类型)

    文章内容摘自:http://www.cnblogs.com/vamei 1.sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入“对 ...

  3. Python核心编程--学习笔记--2--Python起步(下)

    16 文件和内建函数open(),file() 打开文件: fobj = open(filename, 'r') for eachLine in fobj: print eachLine, #由于每行 ...

  4. 推荐一个sqlce,sqllite等数据库管理工具

    推荐一个sqlce,sqllite等数据库管理工具 下载地址: http://fishcodelib.com/files/DatabaseNet4.zip 支持sqlserver,sqlce, sql ...

  5. hdu 4609 3-idiots <FFT>

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意: 给定 N 个正整数, 表示 N 条线段的长度, 问任取 3 条, 可以构成三角形的概率为多 ...

  6. Android内存管理机制

    相信一步步走过来的Android从业者,每个人都会遇到OOM的情况.如何避免和防范OOM的出现,对于每一个程序员来说确实是一门必不可少的能力. 今天我们就谈谈在Android平台下内存的管理之道,开始 ...

  7. Amazon Kindle Device is hiring in Beijing Shanghai and Shenzhen!

    This is Angela from recruitment team of Amazon Kindle Device Software & Applications, we are exp ...

  8. Android编程: MVC模式、应用的生命周期

    学习内容:Android的应用剖析.MVC模式.应用的生命周期 ====Android的应用剖析==== 一个Android应用程序会使用如下组件: Android Activities   界面 A ...

  9. UIGestureRecongnizer 手势检测 swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  10. Objective-C面向对象(四)

    1.协议(protocol)和委托 1.1 规范.协议与接口 OC中协议的作用就相当于其他语言中接口的作用.协议定义的是多个类共同的公共行为规范,协议通常定义一组公用方法,但不提供实现. 1.2 定义 ...