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

概述

HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET  Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

IHttpHandler是什么

IHttpHandler在MSDN中的定义:使用自定义的HTTP处理程序同步处理HTTP Web请求而实现的协定。(注意:如果是异步的话就要使用IHttpAsyncHandler接口)
IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
IHttpHandler包含一个属性IsReusable,用于获取当前IHttpHandler实例是否可用,一般设置为true;一个方法ProcessRequest(HttpContext context),进行实际的操作过程。

IHttpHandler如何处理HTTP请求

当一个HTTP请求经过HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。

流程图

这里写图片描述

httpHandlers结点中各属性意义

这里写图片描述
Verb属性
指定了处理程序支援的HTTP动作。“*”支持所有的HTTP动作;“GET”支援Get操作;“POST”支援Post操作;“GET, POST”支援两种操作
Path属性
指定了需要调用处理程序的路径和文件名(可以包含万用字元).“”、“.aspx”
Type属性
用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型. ASP.NET运行时首先搜索bin目录中的DLL,接着在GAC中搜索

Web.Config中的配置

这里写图片描述

选择泛型处理常式,然后输入名称,如图所示:

这里写图片描述

创建档之后所看到的原始代码,如图所示:

这里写图片描述

IRequiresSessionState,讀取Session值所用接口; context.Response.Write(“Hello World”) 返回值

这里写图片描述

学习资料

1.1 ASP.NET中的異步 HttpHandler實現
http://www.hello-code.com/blog/asp.net/201512/5793.html

1.2 HttpHandler的認識與加深理解
http://www.cnblogs.com/whtydn/archive/2009/10/19/1585778.html

1.3 什麼是HttpHandler
http://www.studyofnet.com/news/378.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Agent 是一种 Java 应用程序的增强方式,可以在不修改应用程序源代码的情况下,对其进行一些特定的操作,例如监控、日志记录、性能调优等。 Micrometer 是一款度量指标库,它提供了一种统一的 API,用于在 Java 应用程序中收集和展示各种类型的度量指标,例如计数器、计时器、直方图等。 在利用 Java Agent 监控 HTTP 请求的处理过程时,可以借助 Micrometer 来收集和展示各种类型的度量指标。以下是实现方法: 1. 在 Java Agent 中,使用 Instrumentation API 找到 HTTP 请求处理类的字节码,然后对其进行增强,添加 Micrometer 相关的代码。 2. 在 HTTP 请求处理类中,使用 Micrometer API 创建并初始化度量指标,例如计数器和计时器。 3. 在 HTTP 请求处理类的方法中,根据请求的不同情况,使用 Micrometer API 更新度量指标的值,例如增加计数器的值或记录计时器的耗时。 下面是一个简单的示例,演示如何利用 Java Agent 和 Micrometer 监控 HTTP 请求的处理过程: 1. 创建一个 Java Agent,代码如下: ```java public class HttpAgent { public static void premain(String agentArgs, Instrumentation inst) { Class<?> httpClass = null; for (Class<?> clazz : inst.getAllLoadedClasses()) { if (clazz.getName().equals("com.example.HttpHandler")) { httpClass = clazz; break; } } if (httpClass != null) { inst.addTransformer(new HttpTransformer()); } } } ``` 2. 创建一个字节码转换器,代码如下: ```java public class HttpTransformer implements ClassFileTransformer { @Override public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException { if (className.equals("com/example/HttpHandler")) { ClassReader cr = new ClassReader(classfileBuffer); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new HttpClassVisitor(cw); cr.accept(cv, 0); return cw.toByteArray(); } return classfileBuffer; } } ``` 3. 创建一个类访问器,代码如下: ```java public class HttpClassVisitor extends ClassVisitor { public HttpClassVisitor(ClassWriter cw) { super(Opcodes.ASM5, cw); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); if (name.equals("handle")) { mv = new HttpMethodVisitor(mv); } return mv; } } ``` 4. 创建一个方法访问器,代码如下: ```java public class HttpMethodVisitor extends MethodVisitor { public HttpMethodVisitor(MethodVisitor mv) { super(Opcodes.ASM5, mv); } @Override public void visitCode() { super.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "counter", "Lio/micrometer/core/instrument/Counter;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Counter", "increment", "()V", false); mv.visitLdcInsn("http.requests"); mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "timer", "Lio/micrometer/core/instrument/Timer;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Timer", "record", "(Ljava/time/Duration;)V", false); } @Override public void visitInsn(int opcode) { if (opcode >= Opcodes.IRETURN && opcode <= Opcodes.RETURN) { mv.visitFieldInsn(Opcodes.GETSTATIC, "io/micrometer/core/instrument/Metrics", "timer", "Lio/micrometer/core/instrument/Timer;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "nanoTime", "()J", false); mv.visitInsn(Opcodes.DUP2); mv.visitInsn(Opcodes.LSUB); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/time/Duration", "ofNanos", "(J)Ljava/time/Duration;", false); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "io/micrometer/core/instrument/Timer", "record", "(Ljava/time/Duration;)V", false); } super.visitInsn(opcode); } } ``` 5. 在 HTTP 请求处理类中,使用 Micrometer API 创建并初始化度量指标,例如计数器和计时器,代码如下: ```java public class HttpHandler { private final Counter requests = Metrics.counter("http.requests"); private final Timer requestTimer = Metrics.timer("http.requestTimer"); public void handle(HttpRequest request, HttpResponse response) { requests.increment(); Timer.Sample sample = Timer.start(); try { // 处理请求 } finally { sample.stop(requestTimer); } } } ``` 6. 在 HTTP 请求处理类的方法中,根据请求的不同情况,使用 Micrometer API 更新度量指标的值,例如增加计数器的值或记录计时器的耗时,代码如上所示。 通过以上步骤,就可以利用 Java Agent 和 Micrometer 监控 HTTP 请求的处理过程,实时收集和展示各种类型的度量指标,例如请求总数、请求响应时间、请求处理时间等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值