`

ASP.NET运行机制之一般处理程序(ashx)

 
阅读更多

一. 概述

 

   新建一个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作为后台处理实现响应get和post请求示例代码.zip

    在ASP.NET web应用程序开发中,一般处理程序(.ashx文件)是一种轻量级的HTTP处理器,用于处理HTTP请求,而无需使用完整的ASP.NET页面生命周期。这种处理程序主要用于执行特定的任务,例如处理图像生成、XML服务或者...

    安卓Android源码——android与asp.net中的一般处理程序ashx进行交互.rar

    本压缩包中的资源主要涉及如何使用Android客户端与ASP.NET服务器上的通用处理程序(Ashx)进行通信,并处理返回的JSON数据。以下是对这些知识点的详细解释: 1. **Android网络访问**:Android平台提供了多种方法来...

    Asp.net请求处理之管道处理介绍

    当一个HTTP请求到达Web服务器时,IIS(Internet Information Services)接收到这个请求,并将其传递给ASP.NET运行时,即HttpRuntime。HttpRuntime是ASP.NET的核心组件,负责管理和协调应用程序的生命周期以及请求...

    asp.net生命周期

    在ASP.NET中,它处理的是如.aspx、.ascx、.ashx、.asmx等扩展名的文件。一旦确定,ASP.NET引擎就会接手并开始处理请求。 应用程序启动时,ASP.NET会创建一个名为ApplicationManager的类的实例,它负责创建一个应用...

    Linux下采用MonoJexus部署ASP.NET-MVC、WCF、WebAPI、C应用程序.docx

    Linux 下采用 Mono 和 Jexus 部署 ASP.NET-MVC、WCF、WebAPI、C 应用程序 Linux 系统下,采用 Mono 和 Jexus 可以实现 ASP.NET-MVC、WCF、WebAPI、C 应用程序的部署。Mono 是一个开源的、跨平台的 .NET 实现,能够...

    web错误统一处理 ASP.NET的错误处理机制

    ASP.NET是微软开发的一款用于构建Web应用程序的框架,它提供了丰富的功能和强大的错误处理机制,以确保应用程序在遇到异常情况时能优雅地处理错误并提供反馈。本文将深入探讨"Web错误统一处理"以及ASP.NET的错误处理...

    asp.net版本kindeditor4.1.10

    此外,如果需要在服务器端处理KindEditor生成的内容,可以利用ASP.NET的服务器控件或ModelBinder机制,将编辑器内容转换为模型属性,便于进一步的业务逻辑处理。 总的来说,将KindEditor集成到ASP.NET应用中,可以...

    WIN2003 IIS 支持 ASP.NET插件 .net framework 2.0

    对于开发和运行基于ASP.NET的Web应用程序来说,.NET Framework 2.0是一个关键组件。这篇内容将深入探讨如何在WIN2003上的IIS中安装和配置ASP.NET插件,以及.NET Framework 2.0的相关知识点。 首先,我们需要了解...

    asp.net架构基础知识--asp.net请求的处理过程

    ASP.NET架构基础知识主要涵盖Web应用程序...总之,ASP.NET的请求处理机制是其强大功能的基础,它使得开发者能够创建高度交互的Web应用程序。通过了解这一流程,开发者可以优化性能,解决调试问题,并提升整体开发效率。

    Programming ASP.NET3.5.pdf(Mircrosoft press)

    这种动态编译不仅限于ASP.NET页面,还包括.NET Web服务(`.asmx`文件)、Web用户控件(`.ascx`文件)、HTTP处理程序(`.ashx`文件)以及全局应用程序文件(global.asax)等。动态编译的过程由一系列运行时模块组成的管道来...

    在ASP.NET中进行消息处理(一)

    - **ASHX自定义处理程序**:轻量级的处理程序,用于处理非页面请求,如服务接口。 6. **事件模型** - **HttpApplication事件**:如BeginRequest、EndRequest、AuthenticateRequest等,这些事件在HTTP请求生命周期...

    ASP.NET源码——[整站程序]小E内容管理系统Web层源码.zip

    在这个系统中,Web层主要包含ASP.NET页面(.aspx)、用户控件(.ascx)和HTTP处理程序(.ashx)。这些组件直接与用户交互,接收和响应HTTP请求。 2. **ASP.NET页面生命周期**: 当一个.aspx页面被请求时,它会经历...

    ASP.NET体系结构

    HttpHandler则负责处理特定类型的请求,如.aspx页面、.ashx自定义处理程序等。 11. HttpContext,HttpModules和HttpHandlers HttpContext是每个请求的上下文对象,它包含请求和响应的详细信息。HttpModules在请求...

    ASP.NET应用教程

    其次,ASP.NET提供了多种网页类型,如ASPX(包含HTML和服务器控件的网页)、ASHX(HTTP处理程序,用于处理特定的HTTP请求)和ASMX(Web服务,支持XML Web服务)。开发者可以根据需求选择合适的网页类型进行开发。 ...

    ASP.NET的网页代码模型及生命周期

    在服务器中,ASP.NET框架解释信息,并触发事件与之对应的处理程序。该程序可以是.aspx页面中的处理程序,也可以是开发者自定义的类库,或者COM组件等。事件驱动处理如图4-7所示。 图4-7 页面框架的事件驱动处理...

    基于C#+ASP.NET的仿163网盘无刷新文件上传系统源代码

    在这个项目中,ASP.NET为文件上传系统提供了一个运行环境和服务器端处理机制。 3. **无刷新文件上传**:无刷新文件上传是指用户在不刷新整个页面的情况下,能够完成文件的上传。这通常通过Ajax技术实现,利用...

    ArcGis代理.Net版本proxy.ashx

    1. **创建proxy.ashx文件**:根据提供的源代码或者下载的包,创建一个ASP.NET的HTTP处理程序。 2. **配置IIS**:将proxy.ashx添加到IIS站点中,并设置正确权限。 3. **设置ArcGIS服务**:在ArcGIS Server上,为...

    asp.net留言板开发

    开发者会为每个功能创建对应的处理程序(如ASPX页面或ASHX Handler),并在这些处理程序中编写具体的C#或VB.NET代码。 增删改查功能的实现涉及到页面的生命周期管理。当用户点击“提交”按钮时,按钮的Click事件会...

    asp.net+SilverLight_5.01图片批量上传

    在ASP.NET和Silverlight的结合下,实现图片批量上传是一项常见的需求,特别是在构建具有丰富交互性的Web应用程序时。此技术结合了ASP.NET服务器端处理能力和Silverlight客户端的用户体验优势,提供了一种高效、便捷...

    深入剖析ASP.NET的编译原理

    在深入剖析ASP.NET的编译原理之前,我们先要理解Web应用程序的基本运行机制。传统的Web应用是通过HTTP协议,每次请求都触发服务器上的脚本或代码执行,然后返回结果给客户端。然而,ASP.NET引入了“编译式”的概念,...

Global site tag (gtag.js) - Google Analytics