SharePoint下在Feature中动态Register/Remove HttpModule

  • 在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里初始化代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏晓晨的专栏

.NET Core 实现 Redis 批量查询指定格式的Key

Redis 作为当前最流行的内存型 NoSQL 数据库,被许多公司所使用,作为分布式缓存。我们在实际使用中一般都会为 key 带上指定的前缀或者其他定义的格式。...

28130
来自专栏偏前端工程师的驿站

理解并自定义HttpModule

前言                                     继上一篇理解并自定义HttpHandler后,有进行了HttpModule的进一步...

19960
来自专栏GreenLeaves

WCF系列教程之WCF中的会话

本文参考自http://www.cnblogs.com/wangweimutou/p/4516224.html,纯属读书笔记,加深记忆 一、WCF会话简介 1、...

21050
来自专栏逸鹏说道

EF批量操作数据与缓存扩展框架

在原生的EF框架中,针对批量数据操作的接口有限,EF扩展框架弥补了EF在批量操作时的接口,这些批量操作包括:批量修改、批量查询、批量删除和数据缓存,如果您想在E...

47860
来自专栏GuZhenYin

ASP.NET Core文件上传与下载(多种上传方式)

官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

28900
来自专栏晓晨的专栏

.NET Core 实现 Redis 批量查询指定格式的Key

Redis 作为当前最流行的内存型 NoSQL 数据库,被许多公司所使用,作为分布式缓存。我们在实际使用中一般都会为 key 带上指定的前缀或者其他定义的格式。...

11610
来自专栏GuZhenYin

ASP.NET Core文件上传与下载(多种上传方式)

前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.N...

63560
来自专栏木宛城主

ASP.NET那点不为人知的事(三)

有了以下的知识: ASP.NET那点不为人知的事(一) ASP.NET那点不为人知的事(二) 想必开发一个小型服务器以不是问题了,功能补复杂,能够响应...

21690
来自专栏一个爱瞎折腾的程序猿

asp.net core权限模块的快速构建

此处的自定义的特性标记不能继承Attribute,因无法在AdminAuthorizeAttribute中的上下文filterContext.Filters中获...

50510
来自专栏拂晓风起

NHibernate 如何对session管理,实现lazy=true

18360

扫码关注云+社区

领取腾讯云代金券