Mvc动态注册HttpModule详解
发布时间 - 2026-01-10 23:21:32 点击率:次序言

注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件。目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件。第一种是通过Global.asax全局文件,另外一种是通过配置文件来注册httpmodule。那么有这2种方式啦,为什么还要有今天这篇博客呢?
这里我也提1个简单的问题,用实例来证明下动态注册httpmodule的可取之处。
如果你要写一个.net框架,供公司所有mvc项目使用,那么你的框架集成的众多功能中,至少应该需要一个异常记录的功能吧,有啦这个功能之后,别人的项目即便忘记处理异常信息,那么框架也会帮忙一个不拉的将项目异常信息写入框架的日志当中,还有你的框架要叼,怎么叼呢?叼到别人不需要写如一行代码即可实现这样的功能,哇咔,怎么实现?在你的框架中,只需要几行代码即可。
Microsoft.Web.Infrastructure.dll与PreApplicationStartMethodAttribute属性
首先我们利用ilspy来看下Microsoft.Web.Infrastructure.dll这个类库是干什么的,如图:
[SecuritySafeCritical]
public static void RegisterModule(Type moduleType)
{
if (DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate != null)
{
DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate(moduleType);
return;
}DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(moduleType);
}
那看到此类库的源码之后,便可以顺藤摸瓜,看清其真面目啦。
- Microsoft.Web.Infrastructure.DynamicModuleHelper 此命名空间我们可以看出他是关于动态module的helper 。
- DynamicModuleUtility此类便是实用类,那么打开之后,便看到啦一个醒目的方法,RegisterModule,注册Module,没错他就是动态注册HttoModule的方法。
思考一下上面我的命题,是在项目中一行代码不用便可执行我们的类库,那么动态注册HttpModule有啦,接下来就是怎么一行代码不写,就能运行我们的类库呢?这就用到啦微软提供的PreApplicationStartMethodAttribute 属性。
- PreApplicationStartMethodAttribute:此属性也可以望文生义,便是在application启动之前要运行的方法。就是说他也是一个程序的入口点,并且还是application初始化之前便启动啦,万物之初先有的便是它,造作吧。
- WebActivatorEx:这是一个类库,微软提供啦PreApplicationStartMethodAttribute特性,微软Nuget开发小组有一个成员David Ebbo写啦这个更叼的类库,内容如下图
呢,这个类库可以动态注册HttpMoudle,他还实现不修改全局文件就可以加入,Application_Start()/Shutdown()事件,源码你可以使用ilspy查看,也有项目的git地址,通过nuget可以获取,值得你去研究下。
代码实现动态注册HttpMoudle
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(RoutingCore.PreApplicationStartRegist), "PreStart")]
namespace RoutingCore
{
public class PreApplicationStartRegist
{
private static bool hasLoaded;
public static void PreStart()
{
if (!hasLoaded)
{
hasLoaded = true;
DynamicModuleUtility.RegisterModule(typeof(RoutingModule));
}
}
}
}
public class RoutingModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
context.Error += new EventHandler(context_ErrorRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
}
void context_ErrorRequest(object sender, EventArgs e)
{
HttpApplication ap = sender as HttpApplication;
var error = ap.Server.GetLastError();
var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500;
if (code != 404)
{
}
// 写入本地文件,队列或数据库
// ...
ap.Server.ClearError();
ap.Response.Write(error.Message);
ap.Response.End();
}
public void Dispose() { }
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# mvc
# httpmodule
# asp.net 请求输入到输出的全过程及httpHandler和httpModuler详细介绍
# Asp.net使用HttpModule压缩并删除空白Html请求的实现代码
# asp.net 通过httpModule计算页面的执行时间
# asp.net通过HttpModule自动在Url地址上添加参数
# asp.net利用HttpModule实现防sql注入
# 类库
# 微软
# 便可
# 要写
# 象中
# 是一个
# 我也
# 望文生义
# 如果你
# 是在
# 也有
# 顺藤摸瓜
# 也会
# 你可以
# 就能
# 他是
# 让我们
# 他也
# 之处
# 要有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
使用C语言编写圣诞表白程序
Laravel如何创建自定义Facades?(详细步骤)
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
如何在Windows服务器上快速搭建网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何实现文件上传和存储?(本地与S3配置)
轻松掌握MySQL函数中的last_insert_id()
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel如何实现API速率限制?(Rate Limiting教程)
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
php json中文编码为null的解决办法
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Python结构化数据采集_字段抽取解析【教程】
如何快速生成可下载的建站源码工具?
网站建设整体流程解析,建站其实很容易!
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
高端云建站费用究竟需要多少预算?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
如何彻底删除建站之星生成的Banner?
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
简单实现Android验证码
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在IIS中新建站点并配置端口与物理路径?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Python并发异常传播_错误处理解析【教程】
音乐网站服务器如何优化API响应速度?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
如何用已有域名快速搭建网站?
用v-html解决Vue.js渲染中html标签不被解析的问题
详解vue.js组件化开发实践
MySQL查询结果复制到新表的方法(更新、插入)
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
如何在新浪SAE免费搭建个人博客?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
高性能网站服务器部署指南:稳定运行与安全配置优化方案
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
JS碰撞运动实现方法详解
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
JavaScript实现Fly Bird小游戏
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网

