2010-08-10 63 views
4

我目前正在开发SharePoint 2010的新功能。随着我的功能部署,我想添加一些设置到我的SharePoint应用程序web.config中的<appSettings/>部分。SharePoint 2010 - 创建补充web.config文件

我在MSDN上发现了一些关于在部署过程中添加补充.config文件的信息,但是我一直无法使其工作。这种方法对我来说似乎是最干净的,因为我可以在单个文件中完成所有更改,并将其部署到应用程序的其余部分。

我已按照文档中的建议创建了webconfig.MyApp.xml文件,将其部署到<SharePoint 14 hive>\Config文件夹,但我的更改未传播到我的应用程序web.config。

下面是我的补充配置文件中的示例片段。

<?xml version="1.0" encoding="utf-8" ?> 
<actions> 
    <add path="configuration/appSettings"> 
     <add key="MyFeatureKey" value="MyFeatureValue" /> 
    </add> 
</actions> 

我想避免手动编辑web.config,因为这些变化可以很容易的SharePoint维修过程中丢失等

如果您有部署Web上的备用维护办法的任何想法.config的变化,我的耳朵是开放的。

更新: 到目前为止给出的答案都很好,我相信他们会工作。但是我正在寻找一种解决方案,可以将其打包在我的单个WSP中,并且无需任何额外步骤即可部署。

+1

关于你的补充文件没有被应用到web.config中: 从MSDN(http://msdn.microsoft.com/en-us/library/ms439965.aspx): “你可以追溯适用修改运行copyappbincontent Stsadm命令行操作的服务器的web.config文件,必须在部署中的每个前端Web服务器上运行该操作。 – 2010-08-13 15:42:19

+0

@Jason Weber - 就是这样,运行'stsadm -o copyappbincontent'是缺失的一块......我想我在文档中查看该行。如果你想补充说,作为答案,我会给你这个问题的功劳。 – 2010-08-13 16:37:28

回答

3

关于您的补充文件未应用于web.config:从MSDN:“您可以通过运行copyappbincontent Stsadm命令行操作追溯地将更改应用于服务器的web.config文件。部署中的每个前端Web服务器。“

+2

请注意,此操作会将配置更改部署到机器上的所有Web应用程序。 – Russell 2011-06-01 06:40:21

0

我相信this会帮助你。使用WebConfigModifications可以被SharePoint记住,并且会自动写入物理web.config文件中,因此易于在多个部署的站点之间进行维护。

+0

感谢您的链接。该帖子中最受欢迎的回答建议使用附加解决方案。看起来很有趣,但我仍然宁愿在我的应用程序中同时部署我的配置更改。 – 2010-08-10 15:09:21

+0

该链接仅引用前端附加组件,以便管理WebConfigModifications。我亲自使用几个PS1脚本和一个csv格式的配置选项列表管理它们。我将在下面包含一个示例。 – Russ 2010-08-10 15:22:18

1

在一个名为AddWebConfigMods.ps1

文件将这个
Param ($weburl, $WebConfigModifications) 

$url = New-Object System.Uri($webUrl) 

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") | Out-Null 
$webApp = [Microsoft.SharePoint.Administration.SPWebApplication]::Lookup($url) 


#delete mods by the owners being added 
$ownerstodelete = $WebConfigModifications | Group-Object owner | Select-Object Name 

foreach($owner in $ownerstodelete) 
{ 
    $modstodelete = @() 
    foreach($mod in $webApp.WebConfigModifications) 
    { 
     if($mod.Owner -eq $owner.Name) 
     { 
      $modstodelete += $mod 
     } 
    } 

    Write-Host ("Deleting " + $modstodelete.Count + " mods for owner: " + $owner) 

    foreach($delmod in $modstodelete) 
    { 
     Write-Host (" + Deleting " + $delmod.Value) 
     $webApp.WebConfigModifications.Remove($delmod) | Out-Null 
    } 
} 

#this is where we start to add mods 
$i = 0; 

Write-Host ("Adding " + $WebConfigModifications.Count + " webconfig modifications to " + $weburl) 

foreach($modEntry in $WebConfigModifications) 
{ 
    Write-Host (" + Adding " + $modEntry.Value) 

    $mod = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification 
    $mod.Path = $modEntry.Path 
    $mod.Name = $modEntry.Name 
    $mod.Sequence = $i++ 
    $mod.Owner = $modEntry.Owner 
    $mod.Type = $modEntry.Type 
    $mod.Value = $modEntry.Value 

    $webApp.WebConfigModifications.Add($mod) 

} 

$webApp.Update() 
$webApp.WebService.ApplyWebConfigModifications() 

然后创建与你的configs一个CSV文件,像这样

Name,Path,Owner,Type,Value 
system.serviceModel,configuration,alinean-common,EnsureSection,<system.serviceModel/> 
connectionStrings,configuration,alinean-common,EnsureSection,<connectionStrings /> 
appSettings,configuration,alinean-common,EnsureSection,<appSettings /> 
serviceHostingEnvironment,configuration/system.serviceModel,alinean-common,EnsureChildNode,<serviceHostingEnvironment aspNetCompatibilityEnabled='true'/> 

然后在另一个PS1脚本,最好你用它来部署一个您的解决方案,导入csv config选项并调用在第一个代码块中创建的函数:

+0

感谢您的详细信息。我会试试这个。 – 2010-08-10 15:49:54

+0

这一切看起来不错,我相信它会工作。但这仍然是一个额外的步骤。理想情况下,我希望将所有内容捆绑在我的1个wsp包中,以方便客户部署。 – 2010-08-10 19:22:52

+0

如果有帮助,你只需要运行脚本一次。之后,每次升级wsp时,SharePoint都会为您提供Web配置修改。 虽然我听到了你的话,但希望别人能用更好的解决方案加以注意。 – Russ 2010-08-10 21:56:37

0

Russ是正确的,您需要使用WebConfigModifications。 Here是另一种使用简单代码的资源。

5

正如Russ和breischl所示,您可以使用SPWebApplication对象的WebConfigModifications属性。要将此功能与您的功能一起部署,请将您的代码放入功能接收器中。这样,您可以在安装功能时自动修改web.config。

在您的功能接收器中,不要忘记调用SPWebApplication对象上的ApplyWebConfigModifications()属性。

例子: http://weblogs.asp.net/wesleybakker/archive/2009/01/21/web.config-modifications-with-a-sharepoint-feature.aspx

您可以打包既您的功能,并在单一封装WSP您的功能接收器组件。

+0

感谢您的链接 - 尝试此方法时出现错误。我已经添加了一个单独的SO问题来跟踪这个错误@ http://stackoverflow.com/questions/3478441/sharepoint-2010-receiving-error-attempting-to-use-spwebconfigmodification – 2010-08-13 15:40:06

+0

这种方法似乎解决了所有的华莱士关注。这可能不起作用,如果节点下的条目顺序很重要,例如为HttpModule注册。 – 2010-08-13 15:44:39

2

创建补充配置文件时,web.config修改为不自动合并,直到您致电stsadm -o copyappbincontent

您也可以强制执行此命令通过FeatureReceiver运行。

在反射探索stsadm工具后,我发现copyappbincontent操作使得为搞清楚了这一点,以SPWebApplication.WebService.ApplyApplicationContentToLocalServer()

public override void FeatureActivated(SPFeatureReceiverProperties properties) 
{ 
    var webApp = (SPWebApplication)properties.Feature.Parent; 
    webApp.WebService.ApplyApplicationContentToLocalServer(); 
} 

道具调用@Jason韦伯,但不幸的是,他把他的回答中而不是一个问题。