利用Feature receiver自动注册/卸载Http Module

最近做了一个项目,里面有一个根据用户AD属性进行页面跳转的需求,通常的实现方法是在首页增加一个Web Part,在里面去做一些逻辑处理,不过我认为这样效率不高,因为:

1. 首先有个跳转页面,每次访问,都会对这个跳转页面进行解析,然后跳转到目的页面,这样为了访问一个页面,就需要等待2个页面加载。

2. 不利于扩展。如果用户需求变更,针对访问其他页面的时候也要做额外的身份验证,那把这样一个web part放到所有页面就显得不现实了。

 

所以我选择使用Http Module,针对HttpRequest,在页面加载前进行处理。对于Http Module,注册需要写到对应的web.config文件中。就需要使用一种能够自动化的方式实现,这里就需要编程的方法操作Web.config文件

 

以下代码实现一个Feature receiver(Scope需要设置为WebApplication),在激活feature的时候去注册Http Module,反激活时候去卸载。

实现的时候需要注意II6和IIS7注册的位置是不同的

 

    public class DemoFeatureEventReceiver : SPFeatureReceiver
    {
        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPWebApplication WebApp = (SPWebApplication)properties.Feature.Parent;
            WebApp.WebConfigModifications.Add(CreateHttpModuleModification());
            WebApp.WebService.ApplyWebConfigModifications();
            WebApp.WebService.Update();
        }

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPWebApplication WebApp = (SPWebApplication)properties.Feature.Parent;
            WebApp.WebConfigModifications.Remove(CreateHttpModuleModification());
            WebApp.WebService.ApplyWebConfigModifications();
            WebApp.WebService.Update();
        }

        public SPWebConfigModification CreateHttpModuleModification()
        {
            SPWebConfigModification modification;
            string ModName = "add[@name='DemoHttpModule']";
            //IIS 6
            //string ModXPath = "configuration/system.web/httpModules";
            //IIS 7
            string ModXPath = "configuration/system.webServer/modules";
            modification = new SPWebConfigModification(ModName, ModXPath);
            modification.Owner = "Lambert Qin";
            modification.Sequence = 0;
            modification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
            modification.Value = String.Concat("<add name=\"DemoHttpModule\" type=\"", GlobalVariables.DemoHttpModule_ASSEMBLY_NAME, "\" />");
            return modification;
        }


    }
posted @ 2011-02-10 22:22  Lambert Qin  Views(424)  Comments(3Edit  收藏  举报