PreApplicationStartMethod

在 ASP.NET 网站中,有一些工作必须在网站初始化阶段完成,比如自定义的虚拟路径提供器,通常情况下,我们需要在 Global.asax 中进行注册,或者使用 App_Code 目录中任意类的 AppInitialize 静态方法。在 CoderZh 的 VirtualPathProvider注册的问题 中讨论了这两种方法。

在 ASP.NET 4.0 中提供了一个新的特征 PreApplicationStartMethod 允许我们在上边初始化之前完成网站的初始化,这样,我们可以在一个类库项目中使用这个特征来标记需要在网站中提前初始化的方法。但是对于多个程序集的情况下,不能保证调用程序集定义的应用程序启动方法的顺序。因此,每个注册的开始方法应该将代码编写为分开运行,不应该依赖于其他注册开始方法的副作用。

详细说明见 MSDN 的 PreApplicationStartMethodAttribute 类

下面的代码演示了如何注册自定义的 VirtualPathProvider,网站项目中仅仅引用这个项目即可,不需要进行额外的配置了。

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 
 using System.Web;
 
 [assembly: PreApplicationStartMethod(typeof(MyNamespace.Class1), "Init")]
 
 namespace MyNamespace
 {
 
     public class DemoVirtualPathProvider : System.Web.Hosting.VirtualPathProvider
     {
     }
 
     public class Class1
     {
         public static void Init()
         {
             DemoVirtualPathProvider provider = new DemoVirtualPathProvider();
             System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(provider);
         }
     }
 }

 动态注册HttpModule

First,我们实现自定义的HttpModel

public class CustomModule : IHttpModule
    {
        public void Dispose()
        {
            //nothing to do here
        }

public void Init(HttpApplication context) { context.BeginRequest += (sender, e) => ProcessCookie((HttpApplication)sender); } } }

Second,建立一个静态类,并命名为PreApplicationStartCode,并增加一个静态方法PreStart()

public class PreApplicationStartCode
    {
        private static bool _isStarting;

        public static void PreStart()
        {
            if (!_isStarting)
            {
                _isStarting = true;
                //注意这里的动态注册,此静态方法在Microsoft.Web.Infrastructure.DynamicModuleHelper
                DynamicModuleUtility.RegisterModule(typeof(CustomModule));

            }

        }
    }

Note.这里的类名官方里面建议用PreApplicationStartCode,我没测试过,大家可以测试下用其他类名

Three,在Properties/AssemblyInfo.cs里面注册

[assembly: PreApplicationStartMethod(typeof(MyTest.PreApplicationStartCode), "PreStart")]

通过这三步,你的HttpModule就不在需要为每个应用程序去配置了,这种方式比较适合开发组件DLL的时候,需要注册HttpModule的情况,微软的Asp.net MVC3里都是使用的动态HttpModule,有兴趣可以去看源码。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。