#.NET EF中HttpModule与HttpHandler对象的基本使用

Posted 爱喝可乐的阿囧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#.NET EF中HttpModule与HttpHandler对象的基本使用相关的知识,希望对你有一定的参考价值。

HttpModule与HttpHandler对象的基本介绍

  1. 对于HTTP请求来说,HttpModule是HTTP请求的“必经之路”,它可以在HTTP请求的过程中做出一些额外的工作,或者在某些情况下终止一些请求,起到过滤器的作用,每个HTTP响应都能经过多个HttpModule处理
  2. HttpHandler是HTTP最终的处理中心,负责具体的工作。

HttpModule

创建HttpModule类

创建一个项目Webone,添加一个HttpModule.cs类,该类实现IHttpModule接口,代码如下:

	public class HttpModule : IHttpModule
    {
    	public void Dispose()
        {
            throw new NotImplementedException();
        }
        public void Init(HttpApplication context)
        {
            throw new NotImplementedException();
        }
    }

Init()执行初始化的工作,在其中绑定触发的事件,代码如下:

	public void Init(HttpApplication context)
      {
      	//初始化,为HttpApplication绑定两个事件
      	//HttpHandle处理前的事件
          context.BeginRequest += Context_BeginRequest;
          //HttpHandle处理后的事件
          context.EndRequest += Context_EndRequest;
      }
	//在处理之后附加信息
      private void Context_EndRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          app.Response.Write("结束处理请求");
      }
	//在处理之前附加信息
      private void Context_BeginRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          app.Response.Write("开始处理请求");
      }

配置Web.config

HttpModule.cs类写完之后还要在Web.config文件中配置,代码如下:

<configuration>
	<system.webServer>
    <modules>
      <add name="mod" type="Webthree.HttpModule"/>
    </modules>
  </system.webServer>
</configuration>

创建一个Web Form啥也不用写,运行效果如下:
运行结果

HttpHandler

防盗链案例

防盗链技术是Web项目开发中必定会用到的技术,否则网站资源会被其他网站引用,因此造成损失。一些不良网站开发为了不增加成本并且能扩展网站的内容,他们会通过盗链的方式盗用其他网页的资源,比如图片等,他们会将图片的地址直接引用到我们的图片地址上,因此会增加我们服务器的负担,造成损失。
HttpHandler的使用通过防盗链案例来简单实现,创建两个项目:Webtwo和Webthree

创建HttpHandler类

创建一个类HttpHandler.cs实现IHttpHandler接口,代码如下:

	public class HttpHandler : IHttpHandler
    {
    	public bool IsReusable => throw new NotImplementedException();

        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException();
        }
    }

在ProcessRequest()方法中写相关代码:

public void ProcessRequest(HttpContext context)
        {
        	//获取上一次请求的URL
            Uri las = context.Request.UrlReferrer;
            //获取本次请求的URL
            Uri con = context.Request.Url;
            //判断两次请求的URL中服务器、端口是否相同,如果不同说明是盗链
            if (las.Host != con.Host || las.Port != con.Port)
            {
            	//如果是盗链就获取警告的图片路径,返回警告的路径,不返回原图片的地址
                string url = context.Request.PhysicalApplicationPath + "imager/3.jpg";
                //将路径发送到客户端
                context.Response.WriteFile(url);
            }
            else
            {
            	//如果不是盗链,就返回原路径
                context.Response.WriteFile(context.Request.PhysicalPath);
            }
        }

配置Web.config

下一步跟HttpModule差不多,也要在Web.config中配置,代码如下:

<configuration>
	<system.webServer>
	    <handlers>
	      <add verb="*" path="imager/*" type="Webone.HttpHandler" name="hand"/>
	    </handlers>
	</system.webServer>
</configuration>

配置完成后就可以了,接下来,我们来写一点前端页面,在原页面上放几张图片,如下:

前端

<body>
    <form id="form1" runat="server">
        <div>
            <img src="imager/1.jpg" />
            <img src="imager/2.jpg" />
        </div>
    </form>
</body>

显示效果如下:
显示效果
在另一个项目Webthree中也建一个Web Form来模拟盗链的网页,其中前端代码为:

<body>
    <form id="form1" runat="server">
        <div>
            <h1>隔壁的图片真好看</h1>
            <img src="https://localhost:44350/imager/1.jpg" />
            <img src="https://localhost:44350/imager/2.jpg" />
        </div>
    </form>
</body>

在这里,img引用的地址是被盗链的网页上图片的地址,我们运行来看一下效果:
运行效果
很明显,我们原来网页上的两个图片被掉了,防盗链的目的实现了。

说明

最后说一下,我的三个项目是建在一个解决方案里的
解决方案
这只是为了方便演示。

以上就是本次案例的全部内容,希望能给大家一点帮助和启发~
如果哪里有问题请联系我,我会加以改正~

以上是关于#.NET EF中HttpModule与HttpHandler对象的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

#.NET EF中HttpModule与HttpHandler对象的基本使用

#.NET EF中HttpModule与HttpHandler对象的基本使用

ASP.NET 管道事件与HttpModule, HttpHandler简单理解

HttpApplication处理对象与HttpModule处理模块

asp.net预定义的HttpModule

HttpModule Init 方法何时在 ASP.NET 集成模式下运行?