在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程。

一、新建一个framework类库

该类库中包含我们需要的IHttpHandler处理程序。

新建一个名为ApiHttpHandler的类,并继承IHttpHandler接口。如下代码:

namespace MyHttpHandler
{
public class ApiHttpHandler : IHttpHandler
{
public bool IsReusable => true; public void ProcessRequest(HttpContext context)
{
context.Response.Write("ApiHttpHandler");
}
}
}

二、新建一个空的项目

将IHttpHandler配置到web.config的handlers节点,如下所示:

<system.webServer>
<handlers>
<!--使用单个IHttpHandler-->
<add name="apiHttpHandler" type="MyHttpHandler.ApiHttpHandler,MyHttpHandler" path="/api/*" verb="*"/>
</handlers>
</system.webServer>

name:在配置文件中对当前handler自定义的名称;

type:组成格式 "handler类名,handler所在的程序集名称";

path:当前handler需要处理的请求的path路径;

verb:请求的方式,如:Post,Get等。

新建一些html页面来测试,web项目程序结构如下:

Login.html就是默认的首页,在项目的属性中配置:

Login.html页面内容如下:

启动程序,查看结果:

三、使用IHttpHandlerFactory配置多个IHttpHandler

新建一个MultiHandler类,继承IHttpHandlerFactory。如下代码:

namespace MyHttpHandler
{
//使用IHttpHandlerFactory来集中管理多个HttpHandler的处理
public class MultiHandler : IHttpHandlerFactory
{
//自定义的字典,key为路径,value为对应的IHttpHandler处理器
protected IDictionary<string, IHttpHandler> handlers = new Dictionary<string, IHttpHandler> {
{ "book",new BookHttpHandler()},
{ "student",new StudentHttpHandler()}
}; //返回一个实现了IHttpHandler接口的实例;
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
IHttpHandler rc = null; //根据第一级路径名来区分
//如 /apis/book/* 需要BookHttpHandler来处理
var path = context.Request.Path?.Split(new string[] { "/"},StringSplitOptions.RemoveEmptyEntries)?.Skip()?.Take()?.FirstOrDefault()??"";
if (handlers.Keys.Contains(path.ToLower()))
rc = handlers[path];
else rc = new DefaultHandler(); return rc;
} //使得Factory可以重复使用一个已经存在Handler实例。
public void ReleaseHandler(IHttpHandler handler)
{
// throw new NotImplementedException();
}
}
}

web项目的web.config如下配置:

<system.webServer>
<handlers>
<!--使用单个IHttpHandler-->
<add name="apiHttpHandler" type="MyHttpHandler.ApiHttpHandler,MyHttpHandler" path="/api/*" verb="*"/>
<add name="fileHttpHandler" type="MyHttpHandler.FileHttpHandler,MyHttpHandler" path="/file/*" verb="POST"/>
<!--使用IHttpHandlerFactory来集中管理多个HttpHandler的处理-->
<add name="multiHandlers" type="MyHttpHandler.MultiHandler,MyHttpHandler" path="/apis/*" verb="*"/>
</handlers>
</system.webServer>

Login.html的内容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<div id="app">
apiResp:{{apiResp}}
<br />
fileResp: {{fileResp}}
<br />
bookResp: {{bookResp}}
<br />
studentResp: {{studentResp}}
<br />
defaultResp: {{defaultResp}}
<br />
<button @click.self.prevent="turnToHome">转到home页面</button>
</div> <script src="js/vue.js"></script>
<script src="js/jquery-3.3.1.min.js"></script>
<script> var app = new Vue({
el: "#app",
data: {
apiResp: "",
fileResp: "",
bookResp: "",
studentResp: "",
defaultResp:""
},
methods: {
turnToHome: function (event) {
window.location.href = "html/Home.html";
}
},
created: function () {
//this.resp = "hello";
var that = this;
$.ajax({
type: "post",
url: "/api/hello",
data: null,
contentType: "text/plain",
success: function (data) {
if (data)
that.apiResp = data;
else that.apiResp = "no data";
},
error: function (err) {
that.apiResp = "error";
}
}); $.ajax({
type: "post",
url: "/file/hello",
data: null,
contentType: "text/plain",
success: function (data) {
if (data)
that.fileResp = data;
else that.fileResp = "no data";
},
error: function (err) {
that.fileResp = "error";
}
}); $.ajax({
type: "post",
url: "/apis/book/hello",
data: null,
contentType: "text/plain",
success: function (data) {
if (data)
that.bookResp = data;
else that.bookResp = "no data";
},
error: function (err) {
that.bookResp = "error";
}
}); $.ajax({
type: "post",
url: "/apis/student/hello",
data: null,
contentType: "text/plain",
success: function (data) {
if (data)
that.studentResp = data;
else that.studentResp = "no data";
},
error: function (err) {
that.studentResp = "error";
}
}); $.ajax({
type: "post",
url: "/apis/default/hello",
data: null,
contentType: "text/plain",
success: function (data) {
if (data)
that.defaultResp = data;
else that.defaultResp = "no data";
},
error: function (err) {
that.defaultResp = "error";
}
});
}
});
</script>
</body>
</html>

启动程序后的结果如下图所示:

我们可以使用IHttpHandler来实现图片的防盗链和其他的功能,用处多多!

参考文档:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html

asp.net IHttpHandler浅析的更多相关文章

  1. Asp.Net Mvc: 浅析TempData机制(转发 作者: Tristan G )

    Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 --------------------------- ...

  2. Owin+ASP.NET Identity浅析系列(五)接入第三方登录

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… OK,用户角色实现后,我们回 ...

  3. Owin+ASP.NET Identity浅析系列(四)实现用户角色

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 通过Owin+ASP.NET ...

  4. Owin+ASP.NET Identity浅析系列(三)框架结构分析

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 前两篇博客仅仅说了下功能如何 ...

  5. Owin+ASP.NET Identity浅析系列(二)扩展用户属性

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 上一篇博客讲了用户登录注册问 ...

  6. Owin+ASP.NET Identity浅析系列(一)用户登录注册

    在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 使用VS2015创建MVC项 ...

  7. Asp.Net IHttpHandler介绍

    ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件 ...

  8. 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]

    前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...

  9. asp.net IHttpModule浅析

    在asp.net程序中,我们除了使用系统自带的HttpModule模块,还可以自己定义一些自己的HttpModule接口模块.一个asp.net程序可以接收多个HttpModule模块. 众所周知,a ...

随机推荐

  1. vscode技巧之代码规范editorconfig

    使用代码片段一键初始化editorconfig样式 第一步,选择文件 第二步,在首选项中选择代码片段 第三步,搜索框中键入properties,并enter键选择进入该文件 第四步,键入下面的代码 { ...

  2. [转载]linux下网卡漂移导致网络不可用

    转自:https://blog.csdn.net/hyatsz/article/details/47690993 linux下网卡漂移导致网络不可用 2015年08月16日 00:48:50 hyat ...

  3. Java语言之循环基础;各个语句的区别

    FOR: WHILE DO WHILE break 与 continue的区别 break直接中断语句跳出循环,continue跳出当前循环,后面会继续执行

  4. 记 Arduino 之 Hello World 篇(Getting Started)

    本文仅为入门实验,甚至谈不上研究的程度.目的是:记录如何烧录程序到 Arduino 主板,以及通过一些简单例程,找到 Arduino 开发的感觉. 开发环境:Ardunio IDE(用于编译.上传运行 ...

  5. Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?

    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么? 答:Object-c的类不可以多重继承,可以实现多个接口(协议),Cate ...

  6. Left Join on 多条件查询时,条件过滤的问题

    例如:A  Left Join B on (...) on 后面的条件是对B数据的过滤,如果要对A的数据或者联合之后的数据集进行过滤,则要把过滤条件放在where子句中

  7. jupyter notebook——安装配置

    本地登陆 cmd输入下面的命令,会进入用户主目录 jupyter notebook 在浏览器打开时,提示输入token,复制命令行上的token还是不能进入,其实浏览器上有提示的,按照提示操作即可,输 ...

  8. k个一组翻转链表(java实现)

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

  9. 20175317 《Java程序设计》第七周学习总结

    20175317 <Java程序设计>第七周学习总结 教材学习内容总结 第七周我学习了教材第八章的内容,学习了许多常用实用类,有以下内容: String类 1. 如何构造String对象 ...

  10. WIN10下Java环境变量配置

    首先,你应该已经安装了 Java 的 JDK 了(如果没有安装JDK,请跳转到此网址:http://www.oracle.com/technetwork/java/javase/downloads/i ...