asp.net mvc使用IHttpModule拦截所有请求,包括资源文件

目录

[HttpApplication 类](#HttpApplication 类)

添加App_Code文件夹

MyHttpModel2

Web.config添加配置,在iis模块中生效

项目发布后,察看注册的自定义模块


  • 框架集:.NET Framework 4.7
  • web框架:asp.net mvc 5

HttpApplication 类

HttpApplication 类 (System.Web) | Microsoft Learn

https://learn.microsoft.com/zh-cn/dotnet/api/system.web.httpapplication?view=netframework-4.8.1#examples

定义对 ASP.NET 应用程序内所有应用程序对象公用的方法、属性和事件。 此类是用户在 Global.asax 文件中定义的应用程序的基类。

注解

类的 HttpApplication 实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建。 类的 HttpApplication 一个实例用于在其生存期内处理多个请求。 但是,一次只能处理一个请求。 因此,成员变量可用于存储每个请求的数据。

应用程序引发可由实现 IHttpModule 接口的自定义模块或 Global.asax 文件中定义的事件处理程序代码处理的事件。 实现 接口的 IHttpModule 自定义模块可以放在 App_Code 文件夹中,也可以放在 Bin 文件夹中的 DLL 中。

HttpApplication在 .NET Framework 版本 3.5 中引入。

备注

在集成模式下运行 IIS 7.0 时,App_Code文件夹或 Bin 文件夹中的自定义模块适用于请求管道中的所有请求。 Global.asax 文件中的事件处理程序代码仅适用于映射到 ASP.NET 处理程序的请求。

添加App_Code文件夹

需要将MyHttpModel2.cs放到App_Code文件夹中,右键web项目,如图操作,添加App_Code文件夹

MyHttpModel2

cs 复制代码
using RmtSendArticleHandle;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using WuZiFenGongSiInfomation.Common;

namespace kantan_shi_yebu.MyHttpModel
{
    /// <summary>
    /// 自定义请求拦截
    /// </summary>
    public class MyHttpModel2 : IHttpModule
    {
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            //context.AcquireRequestState += Context_AcquireRequestState; ;
            //context.PostAcquireRequestState += Context_PostAcquireRequestState;
            context.BeginRequest += Context_BeginRequest;
            context.Error += Context_Error;
        }

        private void Context_Error(object sender, EventArgs e)
        {
            HttpApplication httpApp = (HttpApplication)sender;
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;
            string requestURL = request.Url.OriginalString;
            WuZiFenGongSiInfomation.Common.LogHelpter.AddLog("请求的url=" + requestURL, null, "MyHttpModel2.Context_Error");

            var response = ctx.Response;

            //XSS漏洞拦截,url注入拦截
            //http://localhost:8034/content/images/*~1*/a.aspx?aspxerrorpath=/                 
            if (requestURL.Contains("*") || requestURL.Contains("~"))
            {
                response.StatusCode = 400;
                response.ContentType = "text/plain; charset=utf-8";
                response.Write("http 400,不允许特殊符号");
                ctx.ClearError();
            }
            else if (requestURL.Contains(".aspx"))
            {
                response.StatusCode = 400;
                response.ContentType = "text/plain; charset=utf-8";
                response.Write("http 400,不允许请求.aspx页面");
               
                ctx.ClearError();
            }
          
        }

        private void Context_BeginRequest(object sender, EventArgs e)
        {
            //可以记录所有请求,包括后台请求、静态文件请求url
            HttpApplication httpApp = (HttpApplication)sender;
            HttpContext ctx = HttpContext.Current;
            var request = ctx.Request;
            string requestURL = request.Url.OriginalString;
            WuZiFenGongSiInfomation.Common.LogHelpter.AddLog("请求的url=" + requestURL, null, "MyHttpModel2");
        }

    }
}

Web.config添加配置,在iis模块中生效

XML 复制代码
<system.webServer>
	<validation validateIntegratedModeConfiguration="false"></validation> 
	<security>
		<requestFiltering>
			<requestLimits maxQueryString="102400" maxAllowedContentLength="102400000" />
		</requestFiltering>
	</security>
 
	<modules>
		<add name="MyHttpModel2" type="kantan_shi_yebu.MyHttpModel.MyHttpModel2"  />
	</modules>
</system.webServer>

项目发布后,察看注册的自定义模块

选中站点,在模块中可以看到,已经注册的模块

相关推荐
大鸡腿同学9 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull9 小时前
MySQL数据冷热分离详解
后端·mysql
AI袋鼠帝9 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
凯尔萨厮9 小时前
创建SpringWeb项目(Spring2.0)
spring·mvc·mybatis
新知图书10 小时前
搭建Spring Boot开发环境
java·spring boot·后端
宸津-代码粉碎机10 小时前
Spring Boot 4.0虚拟线程实战调优技巧,最大化发挥并发优势
java·人工智能·spring boot·后端·python
小码哥_常11 小时前
一个Starter搞定六种防护,Spring Boot API的超强护盾来了
后端
小村儿13 小时前
连载04-最重要的Skill---一起吃透 Claude Code,告别 AI coding 迷茫
前端·后端·ai编程
IT_陈寒13 小时前
Vite的alias配置把我整不会了,原来是这个坑
前端·人工智能·后端
gelald14 小时前
Spring Boot - 自动配置原理
java·spring boot·后端