文档章节

SharePoint下在Feature中动态Register/Remove HttpModule

 木宛城主
发布于 2015/03/02 19:39
字数 766
阅读 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
0
HTTPModules与HTTPHandler

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

邓小峰
2009/03/26
2.5K
0
ASP.NET的(HttpModule,HttpHandler)

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

晨曦之光
2012/03/09
158
0
ASP.NET IHttpModule

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

冰点沐雪
2012/08/07
0
0
SharePoint 2016 功能比较

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

惊艳了青春
03/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 钱不还,我就当你人不在了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享Bigleaf的单曲《小鹿》 《小鹿》- Bigleaf 手机党少年们想听歌,请使劲儿戳(这里) 周日在家做什么? 做手工呀, @poorfis...

小小编辑
12分钟前
4
1
EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
15
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
19
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
23
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部