HttpHandler的认识与加深理解

HttpHandler与HttpModule核心区别及迁移指南 HttpHandler和HttpModule是ASP.NET请求管道中两类关键扩展机制,前者负责终结请求并生成响应,后者通过订阅生命周期事件实现横切逻辑。其设计本质源于对HTTP请求处理流程的分层抽象:Handler对应‘执行单元’,Module对应‘拦截增强’。这种分离支撑了鉴权、日志、缓存等通用能力的复用与解耦,构成传统Web Forms/MVC架构可维护性的底层基础。随着.NET Core演进,二者被Middleware(模块化中间件)和Endpoint Routing(轻量终结点)以更透明、可测试的 阅读详情

HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系. HttpHandler功能的实现通过实现IHttpHandler接口来达到.

当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。

对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。

一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。 

IHttpHandler接口声明:

public interface IHttpHandler
{
   
bool IsReusable { get; }
   
public void ProcessRequest(HttpContext context); //请求处理函数
}

v2.0.50727 下的machine.config中httpHandlers结点是这样的:<httpHandlers />,并没有给出详细的处理程序,在Web.config中才能看到。


<httpHandlers>
    
<remove verb="*" path="*.asmx"/>
    
<add verb="*" path="*.asmx" validate="false" type=""/>
    
<add verb="*" path="*_AppService.axd" validate="false" type=""/>
    
<add verb="GET,HEAD" path="ScriptResource.axd" type=""/>
    
<add verb="GET" path="CrystalImageHandler.aspx" type=""/>
</httpHandlers>

可以看到,在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理. 上面的type部分为了好显示我去掉了,其实你打开web.config,可以看到里面的内容的.

Verb属性:指定了处理程序支持的HTTP动作。*-支持所有的HTTP动作;“GET”-支持Get操作;“POST”-支持Post操作;“GET, POST”-支持两种操作

Path属性:指定了需要调用处理程序的路径和文件名(可以包含通配符).“*”、“*.aspx”

Type属性:用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型. ASP.NET运行时首先搜索bin目录中的DLL,接着在GAC中搜索 

IHttpHandler工厂

IHttpHandlerFactory的作用是对IHttpHandler进行管理。接口如下:

public interface IHttpHandlerFactory
{
    IHttpHandler GetHandler (HttpContext context,
string requestType,string url,string pathTranslated);
    
void ReleaseHandler (IHttpHandler handler);
}

GetHandler返回实现IHttpHandler接口的类的实例
ReleaseHandler使工厂可以重用现有的处理程序实例

HttpHandler的示例:

把硬盘上的图片以流的方式写在页面上 

class TestHandler : IHttpHandler
    {
        
public void ProcessRequest(HttpContext context)
        {
            FileStream fs 
= new FileStream(context.Server.MapPath("test.jpg"), FileMode.Open);
            
byte[] b = new byte[fs.Length];
            fs.Read(b, 
0, (int)fs.Length);
            fs.Close();
            context.Response.OutputStream.Write(b, 
0, b.Length);
        }

        
public bool IsReusable
        {
            
get
            {
                
return true;
            }
        }
    }

Web.Config配置文件

      <httpHandlers>

          <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>

      </httpHandlers>

使用HttpHandler实现图片防盗链  

namespace CustomHandler
{
    
public class JpgHandler : IHttpHandler
    {
        
public void ProcessRequest(HttpContext context)
        {
            
// 获取文件服务器端物理路径
            string FileName = context.Server.MapPath(context.Request.FilePath);
            
// 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
            if (context.Request.UrlReferrer.Host == null)
            {
                context.Response.ContentType 
= "image/JPEG";
                context.Response.WriteFile(
"/error.jpg");
            }
            
else
            {
                
// 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片
                if (context.Request.UrlReferrer.Host.IndexOf("yourdomain.com") > 0)
                {
                    context.Response.ContentType 
= "image/JPEG";
                    context.Response.WriteFile(FileName);
                }
                
else
                {
                    context.Response.ContentType 
= "image/JPEG";
                    context.Response.WriteFile(
"/error.jpg");
                }
            }
        }

       
public bool IsReusable{
           
get{ return true; }
       }
    }
}

 编译后复制DLL文件到Bin文件夹下,然后在web.config注册
    <httpHandlers>
      <add path="*.jpg" verb="*" type="CustomHandler.JpgHandler, CustomHandler" />
    </httpHandlers>

通过IhttpHandler实现图片验证码

ashx是什么文件呢? 其实该文件用于写web handler. 在web里面添加一个这样的文件,可以看到下列的代码:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;

public class Handler : IHttpHandler 
{
    
    
public void ProcessRequest (HttpContext context) 
    {
        context.Response.ContentType 
= "text/plain";
        context.Response.Write(
"Hello World");
    }
 
    
public bool IsReusable {
        
get {
            
return false;
        }
    }
}

在上面的基础上修改我们需要的代码如下:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Web;
using System.Web.SessionState;

public class Handler : IHttpHandler, IRequiresSessionState {

    
public void ProcessRequest(HttpContext context) {
       context.Response.ContentType 
= "image/gif";
       
//建立Bitmap对象,绘图
       Bitmap basemap = new Bitmap(200, 60);
       Graphics graph 
= Graphics.FromImage(basemap);
       graph.FillRectangle(
new SolidBrush(Color.White), 0, 0, 200, 60);
       Font font 
= new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);
       Random r 
= new Random();
       
string letters = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
       
string letter;
       StringBuilder s 
= new StringBuilder();
       
       
//添加随机的五个字母
       for (int x = 0; x < 5; x++) {
           letter 
= letters.Substring(r.Next(0, letters.Length - 1), 1);
           s.Append(letter);
           graph.DrawString(letter, font, 
new SolidBrush(Color.Black), x * 38, r.Next(0, 15));
       }
       
       
//混淆背景
       Pen linePen = new Pen(new SolidBrush(Color.Black), 2);
       
for (int x = 0; x < 6; x++)
           graph.DrawLine(linePen, 
new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));
              
       
//将图片保存到输出流中       
       basemap.Save(context.Response.OutputStream, ImageFormat.Gif);
       context.Session[
"CheckCode"] = s.ToString();   //如果没有实现IRequiresSessionState,则这里会出错,也无法生成图片
       context.Response.End();      
    }

    
public bool IsReusable {
       
get { return true; }
    }
}

最后的就是需要在页面上引用这个验证码了. 创建一个新的aspx页面.
<img src="Handler.ashx" alt="图片验证码" />

需要注意的就是我们继承了一个IRequiresSessionState接口:

public interface IRequiresSessionState{}

Handler类不仅需要实现 IHttpHandler接口,为了在这个Handler类中使用SessionState,还需要实现IRequiresSessionState接口,对于这个接口,MSDN的解释是这样的:Specifies that the target HTTP handler requires read and write access to session-state values. This is a marker interface and has no methods.(中文大概的意思:指定当前Http Handler需要对SessionState值的读写访问权。这是一个标记接口,没有任何方法)。这个接口没有任何需要实现的方法或属性,大家只要记得:如果想在HttpHandler中使用SessionState,必须实现这个接口,实际上也就是在类的标头将这个接口加进去。

收集整理与自己见解总结, 且当回忆, 下次再讨论一下HttpModule的理论与方法.

ASP.NET HttpHandler与HttpModule职责分离原理 HttpHandler和HttpModule是ASP.NET请求管线中两类核心组件,分别承担响应内容生成与横切逻辑处理职责。其设计基于HTTP协议规范与管线事件驱动机制,通过24个标准化事件节点实现精确的执行时机控制。HttpHandler作为唯一拥有ProcessRequest调用权的组件,直接操作Response.OutputStream,决定最终响应体;而HttpModule以事件订阅方式介入各阶段,适用于日志、认证、压缩等全局性功能。这种职责分离架构支撑了高内聚、低耦合的系统演进,也是理解ASP.N 阅读详情

相关推荐

模型参考自适应控制(MRAC):让PID参数动态优化

本文深入解析模型参考自适应控制(MRAC)技术,它通过实时调整PID参数,使控制系统能自动适应系统特性变化和外部干扰。文章详细介绍了MRAC的工作原理、数学基础,并提供了用C语言实现的实战代码示例,帮助工程师解决传统PID控制在非线性、时变系统中参数整定繁琐的难题。

tequila的博客 902

HttpHandler介绍

在Http请求处理流程一文中,我们了解了Http请求的处理过程以及其它一些运作原理。我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpModule,但在Part.1中,我并没有详细讲述如何对它们进行编程,只是轻描淡写地一笔带过。所谓学以致用,前面已经介绍了不少概念和原理。在本文中,我们通过几个范例来了解 IHttpHandler,看看掌握这些原理的实际用途。 1. IHttpHandler 概述 可能和我一样,很多Asp.Net开发人员都有过Asp的背景,以至于我..

zp19860529的博客 2066

lumerical-环形谐振器

利用mode求解器优化得到所需的环的总长度,即环形器的半径,然后通过varFDTD得到光场分布和透过率.

m0_61776728的博客 2189

HttpHandler一般处理程序的简单使用

一般处理程序的简单使用概述HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。 IHttpHandler是什么IHttpHandler在MSDN中的定义:使用自定义的HTTP处理程序同步处理HT

七海桑城 5273

ADS1256单端vs差分接法详解:在STM32上实现8通道电压采集与4通道差分测量的实战对比

本文深入解析ADS1256在STM32平台上的单端8通道与差分4通道电压采集方案,详细对比两种接法的硬件设计、软件配置及性能差异。通过CubeMX配置SPI接口和优化数据读取时序,实现高精度测量,适用于工业监测等高要求场景。

weixin_29165465的博客 245

自动换挡频率计的设计精髓:如何用数字电路优雅地解决量程切换难题

本文深入解析了自动换挡频率计的设计精髓,重点探讨如何利用数字电路优雅解决量程切换难题。通过74系列通用数字集成电路构建智能化的自动量程切换系统,详细介绍了状态检测、决策逻辑和档位执行等核心模块的设计方法,并对比了不同实现方案的优劣,为电子测量领域的工程师提供了实用的硬件设计参考。

weixin_27869497的博客 407

HttpHandler

HttpHandler初探 一、HttpHandler简介 HttpHandler是asp.net真正处理Http请求的地方。在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。 IHttpHandler在MSDN中的定义...

weixin_30527143的博客 493

Swift Package Manager (SPM) 创建并集成本地库

Swift Package Manager (SPM) 在macOS 项目中创建并集成的完整步骤

征战无悔人生 1422

ASP.NET的必须知道的东东(HttpModule,HttpHandler)之二

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释后的数据流返回给客户端浏览器。其实ASP.DLL是一个依附在IIS的ISAPI文件,它负责了对诸如ASP文件,ASA等文件的解释执行,------...

JSGLB61200的博客 543

【2026年华为暑期实习(AI)-6月3日-第一题- 选择题】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 本文探讨了深度学习与计算机科学中的多个关键概念和技术,包括CUDA双缓冲技术、神经网络训练问题、优化算法、概率模型、Transformer架构特性、量化技术、损失函数选择等。通过20道选择题和多项选择题,涵盖了梯度消失/爆炸、神经元死亡、牛顿迭代法、朴素贝叶斯分类、Adam优化器、KV Cache压缩等核心知识点。特别关注了大模型训练中的计算效率、数值稳定性问题,以及实际应用场景如客服Agent的记忆机制优化。题目设计既考察基础理论(如概率分布、指数分布特性),又结合前沿技术(如MoE架构、注意

m0_73659489的博客 81

OpenClaw人人养虾:接入Matrix

Matrix 是一个开放的去中心化通讯协议(Decentralized Communication Protocol),任何人都可以搭建自己的 Homeserver(家服务器)并与全球 Matrix 网络互联。OpenClaw 通过 Matrix Client-Server API 实现接入。

王国平的博客 526

智能检查点优化:动态频率与差异化存储实战

检查点(Checkpoint)是深度学习训练容错的核心机制,其本质并非简单保存模型权重,而是对训练状态——包括模型参数、优化器动量、随机数生成器、学习率调度器等——的完整快照。理解其原理需从训练动力学出发:loss下降趋势、梯度活跃度与系统稳定性共同决定状态变化节奏。技术价值在于平衡IO开销与恢复可靠性,避免传统全量保存导致的带宽浪费与恢复失败。典型应用场景涵盖千卡大模型训练、跨地域联合训练及混合精度分布式任务。本文聚焦‘动态频率’与‘差异化存储’两大工业级优化策略,结合PyTorch实践,提供可落地的状态

cuibinmo3519的博客 350

QT里获取UUID当做唯一文件名称

QT里获取UUID当做唯一文件名称

541

【转】HttpHandler的认识与加深理解

原文:http://www.cnblogs.com/whtydn/archive/2009/10/19/1585778.html HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。HttpHandler与HttpModule不同,一旦定义了自己的HttpHand...

weixin_30438813的博客 84

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

HttpHandler的认识与理解

HttpHandler的认识与加深理解 HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系. HttpHandler功

Maybe_Lee的博客 1360

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

httphandler java_理解并自定义HttpHandler

前言之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过。经过上一篇《asp.net管道模型(管线模型)之一发不可收拾》的总结,对管道模型和请求/响应过程有进一步的了解后,再结合Asp.Net 构架(Http Handler 介绍) - Part.2后终于成功定义自己的HttpHandler和HttpHandlerFactory了^_^、本文有些地方会跟《asp....

weixin_32933155的博客 561

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java httphandler_HttpHandler与HttpModule的理解与应用

理解asp.net管线事件何谓asp.net管线?简单的说就是页面的生命周期,就是页面从你开始请求到展现在你的浏览器期间,asp.net所做的一系列事件。下面给你展现下这些事件(参见与Fish Li)。1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。 有关更多信息,请参见 ValidateRequest 和脚本侵入概述。2. 如果已在 Web.config 文件的 U...

weixin_39836943的博客 392

HTTPModule vs HTTPHandler

直接上结论: HTTPModule:任何请求都将先经过HTTPModule的处理; HTTPHandler:要为请求构造Response时,将根据特定类型的请求调用相应的HTTPHandler。 一、ASP.NET Application Life Cycle Overview 当一个请求到来时,IIS将其分配给ASP.NET Engine,而后这个请求经由Application pipeline经过一系列处理,最终构造对于特定请求的响应,发送给Client。 重要的是这个pipeline。 二、Pipel

u010373266的博客 686

HttpHandler与HttpModule的用处与区别

HttpHandler与HttpModule的用处与区别   问题1:什么是HttpHandler?   问题2:什么是HttpModule?   问题3:什么时候应该使用HttpHandler什么时候使用HttpModule?   答案1:HttpHandl...

ajwqb06628的专栏 267
上一篇: 用C#编写语音自动朗读机器人【转】
msikruby
博客等级 码龄19年 11粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值