不使用配置文件动态注册HttpModule
在asp.net 4.0中,提供了一种不通过修改配置文件注册Module的方法。从.net3.5开始,新提供的PreApplicationStartMethodAttribute特性可以应用在程序集上,使得自定义的网站初始化代码可以在web应用程序的Application_Start初始化环节之前就执行。这个步骤甚至在动态编译和执行Application_Start之前。对于每个程序集,可以定义一次,PreApplicationStartMethodAttribute定义如下:
#region Assembly System.Web.dll, v4.0.0.0 // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.Web.dll #endregion using System; namespace System.Web { // Summary: // Provides expanded support for application startup. [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] public sealed class PreApplicationStartMethodAttribute : Attribute { // Summary: // Initializes a new instance of the System.Web.PreApplicationStartMethodAttribute // class. // // Parameters: // type: // An object that describes the type of the startup method.. // // methodName: // An empty parameter signature that has no return value. public PreApplicationStartMethodAttribute(Type type, string methodName); // Summary: // Gets the associated startup method. // // Returns: // A string that contains the name of the associated startup method. public string MethodName { get; } // // Summary: // Gets the type that is returned by the associated startup method. // // Returns: // An object that describes the type of the startup method. public Type Type { get; } } }
Type用来指定定义了初始化方法的类型,MethodName用来指定将要执行的初始化方法。
通过这种方式,我们可以不在配置文件中固定配置HttpModule,而是定义一个方法,这个方法可以返回需要动态注册的HttpModule,将这个方法以委托的方式等级在一个集合中。在网站启动之前后,每当HttpApplicationFactory创建一个HttpApplication对象,完成正常注册的HttpModule创建及初始化之后,再来创建我们动态注册的这些HttpModule。
对于HttpApplication来说,其Init方法将在网站正常注册的HttpModule创建及注册之后被调用,用来完成自定义的HttpApplication初始化。我们可以在这个时间点动态注册HttpModule。在asp.net网站中,Global.asax文件用来生成一个HttpApplication的派生类。这个类用来创建网站中使用的HttpApplication对象,这就为我们提供了一个时间点,我们可以重写这个派生类的Init方法,完成动态注册HttpModule创建和注册工作。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace HttpRequestDemo { public class Global : System.Web.HttpApplication { private List<IHttpModule> dynamicModules; public override void Init() { base.Init(); this.dynamicModules = DynamicHttpModuleManager.GetModules(); foreach (var item in this.dynamicModules) { item.Init(this); } } protected void Application_Start(object sender, EventArgs e) { } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace UserModule { public delegate IHttpModule CreateDynamicHttpModule(); public static class DynamicHttpModuleManager { private static List<CreateDynamicHttpModule> _createModuleHandlerList = new List<CreateDynamicHttpModule>(); /// <summary> /// 在网站初始化之前,将需要注册的Module类型记录在一个集合中 /// </summary> /// <param name="handler"></param> public static void RegisterDynamicModule(CreateDynamicHttpModule handler) { _createModuleHandlerList.Add(handler); } /// <summary> /// 获取要注册的HttpModule /// </summary> /// <returns></returns> public static List<IHttpModule> GetModules() { List<IHttpModule> lst = new List<IHttpModule>(); foreach (var item in _createModuleHandlerList) { IHttpModule module = item(); lst.Add(module); } return lst; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace UserModule { //自定义的HttpModule中,添加一个Rgister方法,用来注册 public class OnlineUserModule:IHttpModule { public static void Register() { DynamicHttpModuleManager.RegisterDynamicModule(() => new OnlineUserModule()); } public void Dispose() { throw new NotImplementedException(); } public void Init(HttpApplication context) { throw new NotImplementedException(); } } }
最后在项目的AssemblyInfo.cs文件中增加PreApplicationStartMethod特征完成动态注册。
[assembly: PreApplicationStartMethod(typeof(UserModule.OnlineUserModule), "Register")]
注意这里的AssemblyInfo.cs是指的你的程序集的。在里面添加这个PreApplicationStartMethod。然后运行web项目,你会发现,断点会进入你的自定义的HttpModule。
-
博客地址:http://www.cnblogs.com/wolf-sun/
博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2015-03-08 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复