了解ASP .NET运行机制 HttpModule对象和HttpHandler对象

目录

 

ASP .NET运行机制

ASP .NET 处理请求的内部过程

HttpModule对象

HttpModule对象案例

HttpHandler对象

HttpHandler对象 防盗链案例

此时效果(第二给网站获取到了第一个网站的资源):

编写HttpHandler类

在web.config中配置相关配置文件:

最终效果:


 

ASP .NET运行机制

当请求发送至服务器IIS并被其接收后,IIS 服务器会判断请求文件的类型,如果是html、jpg、gif和txt等静态文件,IIS会自行根据目录找到文件并发送给客户端。如果是aspx页面的动态文件,则IIS会通过aspnet. _isapi.dll将请求转交给 ASP.NET运行时环境进行处理,最终的处理结果会返回给IIS,发送到客户端。在ASP.NET运行时,环境中的处理请求是通过一系列对象来完成的,包括HttpApplication、HttpModule和HttpHandler。通过使用HttpApplication对象来处理接收到的请求,HttpApplication 对象每次只能处理一个请求,这样其成员变量才可用于存储针对每个请求的数据,如Response对象和Request对象。

ASP .NET 处理请求的内部过程

 

HttpModule对象

  HttpModule 是HTTP请求的“ 必经之路”, 它可以在该HTTP请求传递到最终的“请求处理中心(HttpHandler)”进行处理之前做一些额外工作, 或者在某些情况下终止满足一些条件的HTTP请求,从而起到一-个过滤器的作用。

HttpModule对象案例

在项目中创建TestHttpModule类,该类实现IHttpModule接口

 public class TestHttpModule : IHttpModule
    {
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            //初始化,为HttpApplication对象绑定两事件
            //在HttpHandler请求处理之前触发的事件
            context.BeginRequest += context_BeginRequest;
            //请求处理完毕触发的事件
            context.EndRequest += context_EndRequest;
        }
        //请求处理前,附加信息
        private void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            application.Response.Write("<p>HttpModule开始处理请求</p>");
        }
        //请求处理完毕后,附加信息
        private void context_EndRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            application.Response.Write("<p>HttpModule结束处理请求</p>");
        }
    }

在web.config中配置相关配置文件:

   <system.webServer>
    <modules>
      <add name="test" type="WebApplication3.TestHttpModule" />
    </modules>
  </system.webServer>

最后创建web窗体(可以什么都不添加),页面效果:

 

HttpHandler对象

  每个请求都可能经过多个HttpModule处理,然而最终的处理中心是HttpAandler。

HttpHandler对象 防盗链案例

  演示防盗链,具体要求如下:
(1)创建一 个网站,网站下的Images文件夹中有ipg图片资源,本网站的页面引用图片的相对路径后可以正常显示。
(2)创建第二个网站,网站下有一个页面引用了上一个网站中的ipg图片资源,结果不能正常显示图片资源,而会显示一个表示错误的图片。
2)创建站点
(1)创建被盗链站点。按照上述要求,首先创建包含了image图片资源的网站,然后添加一个sapx页面,插入本网站提供的三幅图片,相关代码如下(CssClass="wh"是控制一下图片的宽高):

<asp:Image ID="Image1" CssClass="wh" runat="server" ImageUrl="~/images/4.jpg" />
<asp:Image ID="Image2" CssClass="wh" runat="server" ImageUrl="~/images/5.jpg" />
<asp:Image ID="Image3" CssClass="wh" runat="server" ImageUrl="~/images/6.jpg" />

(2)创建盗链站点。创建第二个网站,添加aspx页面,引用第一个网站提供的三张图片的网页路径,相关代码如下:

  <div>
       <asp:Image ID="Image1" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/4.jpg" />
       <asp:Image ID="Image2" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/5.jpg" />
       <asp:Image ID="Image3" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/6.jpg" />
  </div>

此时效果(第二给网站获取到了第一个网站的资源):

编写HttpHandler类

  通过HttpHandler解决盗链问题,创建PreventLink类并实现IHttpHandler接口

public class PreventLink : IHttpHandler
    {
        public bool IsReusable => true;

        public void ProcessRequest(HttpContext context)
        {
            //获取上次请求的URL
            Uri lastUrl = context.Request.UrlReferrer;
            //获取本次请求的URL
            Uri currentUrl = context.Request.Url;
            //判断是否为盗链(如果上次请求的URL和本次请求的URL不一致就为盗链)
            if (lastUrl.Host != currentUrl.Host || lastUrl.Port != currentUrl.Port)
            {
                //获取“请勿盗链”警告提示图片路径
                string errorlmagePath = context.Request.PhysicalApplicationPath + "images/7.jpg";
                //发送至客户端
                context.Response.WriteFile(errorlmagePath);
            }
            else
            {
                context.Response.WriteFile(context.Request.PhysicalPath);
            }
        }
    }

在web.config中配置相关配置文件:

<system.webServer>
      <handlers>
        <add verb="*" path="images/*" type="WebApplication1.PreventLink" name="plink"/>
      </handlers>
  </system.webServer>

在Web。config中配置实现当请求images文件夹中所有图片时,由PreventLink类处理的功能,很多人在这里会出现问题,主要是type找不到PreventLink这个类和截取不到images文件夹中的图片。

最终效果:

如果最后一步有问题可以评论一起讨论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值