asp.net IHttpHandler浅析

在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(1)?.Take(1)?.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

原文地址:https://www.cnblogs.com/williamwsj/p/10264520.html

时间: 2024-08-06 20:29:53

asp.net IHttpHandler浅析的相关文章

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

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的-- 使用VS2015创建MVC项目运行之后,发现微软很贴心的生成了一套用户授权验证系统,界面也很漂亮,但是扒拉代码一看,囧--新的membership框架,真是太给力了,连数据库表都给你生成了(EF的功劳),问题是,你这一堆一堆的代码,虽然看着很吊(也 确实很吊),但是看着人头大呢,只好研究研究,研究过程记录一下,希望可

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

Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 ------------------------------------------------------------------------------ 一. Asp.Net Mvc中的TempData 在Asp.Net Mvc框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictio

Asp.Net IHttpHandler介绍

Asp.Net IHttpHandler介绍 ASP.NET响应Http请求时常用的两个处理接口是IHttpHandler和IHttpModule. 一般的,IHttpHandler用来处理一类特定的请求,比如对每个*.asp, *.aspx文件的分别处理.而IHttpModule通常用来处理所以请求共同需要的操作,比如对所以请求页面进行某些相同的检查功能. 我们先来看一下IIS服务器在相应Http请求时的处理步骤. ASP.NET中有管线(Pipeline)这个概念,意指每个ASP.NET请求

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

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的-- 前两篇博客仅仅说了下功能如何实现,这篇博客来分析IdentityModels.IdentityConfig.Startup.Auth类文件在Owin+ASP.NET Identity框架中起到的作用 IdentityModels类文件存放的是用户.角色.数据库上下文等实体类 IdentityConfig类文件存放的是

asp.net IHttpModule浅析

在asp.net程序中,我们除了使用系统自带的HttpModule模块,还可以自己定义一些自己的HttpModule接口模块.一个asp.net程序可以接收多个HttpModule模块. 众所周知,asp.net web有19个管道事件,我们除了可以在Global.asax中实现其中的某些管道事件,还可以通过IHttpModule接口实现这些管道事件. 一.定义自己的HttpModule模块 新建一个framework类库项目,新增一个OutsideMyModule类,并继承IHttpModul

Xml命名空间浅析

XML实例 在介绍xml命名空间之前,我们先来看段xml代码: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http:/

使用ServiceStack构建Web服务

提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Building Cross-Platform Web Services with ServiceStack,所以这里简要介绍一下如何使用ServiceStack快速建立一个WebService服务. 当然,在开始之前,首先要说明一下ServiceStack是个什么东西. 在国内用ServiceStac

让nodejs在iis上运行

node在IIS上运行的好处: Tomasz的回答是我见过最棒的: 使用iisnode模块在IIS中托管node.js应用程序来取代自托管node.exe进程的优势在于: · 进程管理. Iisnode模式注重node.exe进程的长期管理,能够更简洁地改善整体可靠性.你无需实现用来运行,停止或者显示进程的基础工具. · 多核服务器上的可扩展性.由于node.exe是一个单线进程,只可适用于单核CPU.而iisnode模块允许每个应用中创建多个node.exe进程,并根据HTTP流量调整使其负载

C#开发学习——内联表达式

<%@ 表示:引用 <%# 表示:绑定 <%= 表示:取值 <%= 变量名%> Response.Write()输出和<%=%>输出最后的效果是一样的 <%# 要绑定的字段名%> 或者 <%# 调用后台的方法名%> <% inline code %>叫做内联代码... <%=inline expression %>叫做内联表达式... <%# data-binding expression %>叫做数据绑