在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. 使用QPlainText代替QText

    1.现象 在项目开发中,经常使用QText来显示解析的数据,比如从网络中获取到一个数据包,解析成中文加以显示,当时间过久或者字符串比较多的时候,就会产生一定的卡顿,所以需要限制QText的行数,或者清 ...

  2. [ZOJ 4024] Peak

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4024 从前往后找满足al<al+1的最大下标l,从后往前找 ...

  3. Qt信号槽第5个参数

    1.Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定.如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型.如果接收者和发送者不 ...

  4. MySQL按年度、季度、月度、周、日SQL统计查询

    说明 SELECT YEAR('2014-10-29') //2014 SELECT MONTH('2014-10-29') //10 SELECT DAY('2014-10-29') //29 SE ...

  5. PHP curl Post请求和Get请求~

    //获取的参数 $api_key = '8a82d53a57b06c1d835d129f7e43d49c'; $orderNum = pdo_fetch('select ddlm_order_no f ...

  6. HDU 5115 (杀狼,区间DP)

    题意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时, ...

  7. 在action中进行文件下载,下载时运行不报错,可是也不下载

    在写前端下载页面时,使用ajax方式调用action中的方法,然后就将下载内容返回js中了,所以没有下载,之后改为使用Windows.location进行下载,就没有问题了. action中代码: i ...

  8. 环境准备—之—linux下安装svn--开机自启--及format权限问题

    借鉴自 http://www.cnblogs.com/liuxianan/p/linux_install_svn_server.html 这个很详细,但不是我的风格 https://blog.csdn ...

  9. js ++i和i++的区别

    ++i和i++的定义: 1.  如果用前缀运算符对一个变量增1(减1),则在将该变量增1(减1)后,用新值在表达式中进行其他的运算.    2. 如果用后缀运算符对一个变量增1(减1),则用该变量的原 ...

  10. Postman应用笔记

    Postman应用: 项目组织格式 Collections 集合--项目--根路径文件夹 文件夹 集合下只支持1级文件夹 文件夹 Request --请求 url 认证参数,头信息,体信息(Autho ...