文档章节

SharePoint下在Feature中动态Register/Remove HttpModule

 木宛城主
发布于 2015/03/02 19:43
字数 766
阅读 10
收藏 0
点赞 0
评论 0

 

  • 在SharePoint开发时,你会遇到这样一个问题,Global.asax去哪儿?怎样添加一个Global.asax?怎样在Application_Start这个事件处理程序里设置初始化?似乎在Visual Studio中无法像纯ASP.NET开发那样轻松添加一个Global.asax。
  • 当然找到这个Global.asax也不难,打开IIS,右键浏览对应网站,在网站根目录下你可以找到Global.asax。比如我的网站部署在C:\inetpub\wwwroot\wss\VirtualDirectories\4909路径下。

我不推荐去修改这个Global文件,因为这似乎不是最佳实践。在SharePoint下,我们可以借助HttpModule来实现类似Application_Start功能。那么怎样添加HttpModule呢?无非就是两点:

  • 添加一个HttpModule,当然他是实现IHttpModule接口的。
  • 在Web.Config中加入此HttpModule,在IIS 6.0是加在System.Web节点下,而IIS7.0以上版本是加在System.WebServer节点下。

具体可以看这篇文章:http://msdn.microsoft.com/en-us/library/46c5ddfy(v=vs.100).aspx

当然手动去操作config文件注册HttpModule也是可以的,但这不是最佳的实践,在SharePoint下,我们可以充分的利用Feature的FeatureActivated和FeatureDeactivating事件来动态Register/Remove HttpModule,接下来就一步一步去实现。

添加Feature Event Reveiver

 所以,你可以在Feature中这样定义以web.config modification对象

     private const string WebConfigModificationOwner = "Mintcode.Entreperneur.AutoResourcesModule";
        private static readonly SPWebConfigModification[] Modifications = {
            
            new SPWebConfigModification()
                { 
                    // owner代表此modification的标志,可以用来移除一组modifications
                    Owner = WebConfigModificationOwner, 
                    // 确保name唯一,可以用来移除一个element
                    Name = "add[@name='AutoResourceModule']",
                    // 添加一个xml节点到web.config
                    Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode, 
                    //将此httpmodule添加到此处(iis7以上在system.webServer节点的modules)
                    Path = "configuration/system.webServer/modules",        
                    //第二标志位
                    Sequence = 0,
                    // 确保此处的name和上面name相同 type=NameSpace+Class Name,Assembly Name
                    Value = string.Format("<add name='AutoResourceModule' type='Mintcode.Entreperneur.HttpModules.AutoResourceModule,{0}' />",Assembly.GetExecutingAssembly().FullName )
                }
        };

激活Feature时动态Register HttpModule

public override void FeatureActivated(SPFeatureReceiverProperties properties)
  {
     SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
     if (webApp != null)
     {
         AddWebConfigModifications(webApp, Modifications);
     }           
  }
private void AddWebConfigModifications(SPWebApplication webApp, IEnumerable<SPWebConfigModification> modifications)
        {
            foreach (SPWebConfigModification modification in modifications)
            {
                webApp.WebConfigModifications.Add(modification);
            }

            // 提交modifications到指定的WebApplication中
            webApp.Update();
            // 整个Farm应用一系列modifications 
            webApp.WebService.ApplyWebConfigModifications();
        }

这样就动态的添加了HttpModule。

打开web.config,找到如下代码就意味着添加成功了:

<add name="AutoResourceModule" type="Mintcode.Entreperneur.HttpModules.AutoResourceModule,Mintcode.Entreperneur, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0d288a74a503d5ce" />

Deactivated时卸载HttpModule

当然,你想做的更完美的话,当Feature停止时,相应的Remove掉HttpModule。

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
            if (webApp != null)
            {
                RemoveWebConfigModificationsByOwner(webApp, WebConfigModificationOwner);
            }
        }

当Modification的Owner相同时,Remove掉:

private void RemoveWebConfigModificationsByOwner(SPWebApplication webApp, string owner)
        {
            Collection<SPWebConfigModification> modificationCollection = webApp.WebConfigModifications;
            Collection<SPWebConfigModification> removeCollection = new Collection<SPWebConfigModification>();

            int count = modificationCollection.Count;
            for (int i = 0; i < count; i++)
            {
                SPWebConfigModification modification = modificationCollection[i];
                if (modification.Owner == owner)
                { 
                    removeCollection.Add(modification);
                }
            }

            if (removeCollection.Count > 0)
            {
                foreach (SPWebConfigModification modificationItem in removeCollection)
                {
                    webApp.WebConfigModifications.Remove(modificationItem);
                }
                webApp.Update();
                webApp.WebService.ApplyWebConfigModifications();
            }
        }

这样当Feature停止时,自动删除掉相应的HttpModules

接下来

现在我们已经成功添加了HttpModule,做好了前期准备,接下来再分析怎样在HttpModule的Init方法中实现类似Application_Start里初始化代码。

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
SharePoint Delegate Control

Delegate Control代理控件如同一个控件的容器,它提供了一种机制允许在不直接修改控件的前提下将代理控件内的控件替换成为自定义的控件。代理控件很类似于PlaceHolder,但是它和PlaceHolder...

hxyhxl ⋅ 2014/09/29 ⋅ 0

HTTPModules与HTTPHandler

HTTPModules与HTTPHandler 一 asp.net请求的处理过程 ------------------- HttpModule 必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 ---...

邓小峰 ⋅ 2009/03/26 ⋅ 0

ASP.NET的(HttpModule,HttpHandler)

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

创建与SharePoint 2010风格一致的下拉菜单 (续) 整合Feature Custom Action框架

在上一篇“创建与SharePoint 2010风格一致的下拉菜单”文章中,演示了如何添加一个额外的菜单到页面顶端,并使其的样式风格与SharePoint 2010内置的菜单保持一致。如果只需要创建一个子菜单项...

kaneb0y ⋅ 2011/06/26 ⋅ 0

ASP.NET IHttpModule

IHttpModule接口的定义:向实现类提供模块初始化和处置事件。它包含2个方法:Dispose()和Init(); 自定义IHttpModule接口 实现一个自定义的IHttpModule接口需要2个步骤: 1)实现一个继承了I...

冰点沐雪 ⋅ 2012/08/07 ⋅ 0

Discuz!NT整合网站

最近公司的项目要跟discuz的论坛进行整合,实现用户同步注册,单点登陆,同步删除用户,同步修改用户密码 采用的是discuz!nt,考虑到.NET比较熟悉,方便进行二次开发。 东西还是自己动脑子的...

李朝强 ⋅ 2013/05/13 ⋅ 0

SharePoint 2016 功能比较

SharePoint 2016中有很多功能。我们经常和客户谈论SharePoint安装时,我问他们是否计划安装SharePoint Server 2016 Standard或Enterprise。通常情况下,答案是“有什么区别?”下面我们一起看...

惊艳了青春 ⋅ 03/18 ⋅ 0

SQL Server 2008 SP1和Feature Pack CTP提供了新的特性和工具

微软最近宣布提供了SQL Server 2008 R2 SP1 CTP的下载,其中不仅包括了所有累积的更新,还有SQL Server 2008 R2 SP1 Feature Pack CTP1,其中包含了很多单独的工具,这些工具为SQL Server 20...

墙头草 ⋅ 2011/05/12 ⋅ 0

CKEditor 发布 SharePoint 集成解决方案

CKEditor 发布了免费版的 CKEditor for SharePoint, 这是一个独特的解决方案,用以集成到微软 SharePoint 平台上替换原有的编辑器做为所见即所得的编辑器。 CKEditor for SharePoint 主要特性...

红薯 ⋅ 2010/11/30 ⋅ 2

IHttpModule与IHttpHandler的区别整理

IHttpModule与IHttpHandler的区别整理 1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你响应了哪个事件,一些事件是在Handler之前运行的,一些是在Handler之后运行的 2.对请求的处...

冰点沐雪 ⋅ 2012/08/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部