维护SharePoint Web应用程序的Web.config文件

对于SharePoint来讲,Web.config同样很重要,除了基本的ASP.NET所需的配置项......

维护SharePoint Web应用程序的Web.config文件

介绍

首先,重复一个观点:SharePoint是ASP.NET最大的产品实践,没有之一。说到ASP.NET,除了开发方面的控件,页面生命周期,MVC等等一系列的知识点涌上心头,在配置管理方面第一反应该是Web.config文件。对于SharePoint来讲,Web.config同样很重要,除了基本的ASP.NET所需的配置项,还放置了很多SharePoint的配置项。同时,如果做SharePoint的自定义开发,也有可能需要对Web.config文件进行修改。SharePoint作为ASP.NET基础上的产品,且提供了多服务器场的拓扑管理结构,所以SharePoint提供了针对Web.config文件进行修改的方法。此篇就聊聊在SharePoint中维护Web.config文件的几种方式。

Web.config文件位置

Web.config文件包含在文件系统中的以下文件夹中:

  • \Inetpub\wwwroot\wss\VirtualDirectories\ 端口号 SharePoint 内容 Web 应用程序定义配置设置的 web.config 文件。

  • \Inetpub\wwwroot\wss\VirtualDirectories\ 管理中心的端口号 SharePoint 管理中心应用程序定义配置设置的 web.config 文件。

  • \Inetpub\wwwroot\wss\VirtualDirectories\ 端口号 \wpresources 在 Web 应用程序的 Web 部件资源中使用的 web.config 文件。

  • \Program Files\Common Files\Microsoft Shared\Web Server Extensions\wpresources 在全局程序集缓存的 Web 部件资源中使用的 web.config 文件。

  • %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14 | 15 | 16\CONFIG 共同定义用于扩展其他 Web 应用程序的配置设置的 web.config 文件和其他 .config 文件。

  • %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14 | 15 | 16\ISAPI 为 /_vti_bin 虚拟目录定义配置设置的 web.config 文件。

  • %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14 | 15 | 16\TEMPLATE\LAYOUTS 为 /_layouts 虚拟目录定义配置设置的 web.config 文件。

      注意:本节中的`14 | 15 | 16`文件夹路径根据SharePoint版本确定,SharePoint 2010对应14,SharePoint 2013对应15, SharePoint 2016对应16。
    

Web.config文件管理方式

熟悉ASP.NET开发的同学,对于复杂度不高的项目,Web.config文件的维护很多时候可以依赖手工完成,为什么到SharePoint上,却提供了对象模型,配置管理这样的方式呢?原因有下面两点:

  • 首先,SharePoint作为一个产品,会定期发布更新或者Service Pack,甚至安装升级到下一个版本,这些操作很有可能会覆盖Web.config文件。
  • SharePoint的可扩展拓扑结构是产品本身的优势之一,因此在稍微复杂的应用场景下,一个服务器场往往会涉及多个服务器,甚至会涉及到多个服务器场,因此手工维护Web.config文件工作量大,容易产生疏忽。

以编程方式添加或者删除Web.config设置

通过编程的方式添加或者删除Web.config中的设置,需要使用到Microsoft.SharePoint.Administration命名空间中的SPWebConfigModification类,此类的实例相当于一个XPath路径及以下内容的描述对象。

示例一: 添加Web.config配置项

SPWebService service = SPWebService.ContentService;

SPWebConfigModification myModification = new SPWebConfigModification();
myModification.Path = "configuration/SharePoint/SafeControls";
myModification.Name = "SafeControl[@Assembly='MyCustomAssembly'][@Namespace='MyCustomNamespace'][@TypeName='*'][@Safe='True']";
myModification.Sequence = 0;
myModification.Owner = "User Name";
myModification.Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode;
myModification.Value = "<SafeControl Assembly='MyCustomAssembly' Namespace='MyCustomNamespace' TypeName='*' Safe='True' />";
service.WebConfigModifications.Add(myModification);
 
/*Call Update and ApplyWebConfigModifications to save changes*/ 
service.Update();
service.ApplyWebConfigModifications();

示例二:删除Web.config中的配置项

SPWebConfigModification configModFound = null;
SPWebApplication webApplication = SPWebApplication.Lookup(new Uri("http://localhost/"));
Collection<SPWebConfigModification> modsCollection = webApplication.WebConfigModifications;

// Find the most recent modification of a specified owner
int modsCount1 = modsCollection.Count;
for (int i = modsCount1 - 1; i > -1; i--)
{
    if (modsCollection[i].Owner == "User Name")
    {
        configModFound = modsCollection[i];
    }
}

// Remove it and save the change to the configuration database  
modsCollection.Remove(configModFound);
webApplication.Update();

// Reapply all the configuration modifications
webApplication.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();

注意事项

  • 调用SPWebService.ApplyWebCoinfigModifications()方法,其实是交给一个计时器作业去执行,所以并不是即使生效,会有一定时间差。
  • 需要有系统管理员权限才能执行代码的权限。
  • 示例一中的方式会影响整个服务器场的Web应用程序,如果只是需要修改特定的Web应用程序,可以使用oWebSite.Site.WebApplication.WebConfigModifications.Add(MyModification) 方式增加config配置对象到指定的Web应用程序。

使用补充文件方式

在第一节Web.config文件位置中介绍了SharePoint相关的Web.config文件位置,其中一个是%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14 | 15 | 16\CONFIG。打开这个文件夹,发现其中除了Web.config文件外,还包含一些webconfig.*.xml文件。这些webconfig.\*.xml文件称之为Web.config补充文件。补充文件的内容示例:

<actions>
   <add path="configuration/SharePoint/SafeControls">
      <SafeControl
         Assembly="System.Web, Version=1.0.5000.0, Culture=neutral, 
            PublicKeyToken=b03f5f7f11d50a3a"
         Namespace="System.Web.UI.WebControls"
         TypeName="*"
         Safe="True"/>
   </add>
   <remove path="configuration/SharePoint/RuntimeFilter"/>
   <add path="configuration/SharePoint">
      <RuntimeFilter
         Assembly="Company.Product, Version=1.0.1000.0, 
            Culture=neutral, PublickKeyToken=1111111111"
         Class="MyRuntTimeFilter",
         BuilderUrl="MyBuilderUrl"/>
   </add>
</actions>

在创建Web应用程序或者扩展Web应用程序时,SharePoint会以Web.config文件为基础,再合并所有webconfig.*.xml文件内容到Web.config文件中,作为新创建或者扩展出来的Web应用程序的Web.config文件。

上面讲到的是一种机制,补充文件本身该如何管理呢?最直白的,既然是文件系统物理文件,而且xml文本,因此可以直接手工维护。但这不是我们的初衷,因为这解决不了多服务器场带来的工作量,因此,下面介绍一下使用场解决方案包推送补充文件。

使用场解决方案管理补充文件

当一个SharePoint自定义场解决方案项目需要维护Web.conifig内容时,优先使用此方法。

  1. 在VS中创建场解决方案(适用于SharePoint 2010及以上版本)。

  2. 在解决方案中映射CONFIG文件夹,并创建需要的补充文件。

  3. 打包安装解决方案包后,对应服务器的CONFIG目录下就会被推送对应的补充文件。

     注意:补充文件的命令格式说明,请参考MSDN,这里不做累述。
    

结尾

上面介绍的两种方式都是偏重于开发,且各有优劣,总结一下使用过程中的几个注意事项:

  • 如果只希望精确控制某个Web应用程序,适合使用编程模式。
  • 如果希望控制场中所有Web应用程序,两种方式都适合。
  • 使用补充文件方式,如果是先创建了Web应用程序,再推送的解决方案包,补充文件不会生效,必须运行Install-SPApplicationContent Powershell命令才会生效。