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>

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

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

相关推荐
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风3 小时前
详解K8S--声明式API
后端
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
2401_865854887 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
AskHarries7 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端
2401_857622668 小时前
SpringBoot健身房管理:敏捷与自动化
spring boot·后端·自动化