【问题标题】:SharePoint 2010 - Creating a supplemental web.config fileSharePoint 2010 - 创建补充 web.config 文件
【发布时间】:2010-08-10 14:50:35
【问题描述】:

我目前正在为 SharePoint 2010 开发一项新功能。在部署我的功能的同时,我想在我的 SharePoint 应用程序 web.config 中的 <appSettings/> 部分添加一些设置。

我在 MSDN 上找到了一些关于在部署期间添加补充 .config 文件的信息,但我无法让它工作。这种方法对我来说似乎是最干净的,因为我可以将所有更改放在一个文件中,并将它们与我的应用程序的其余部分一起部署。

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

以下是我的补充配置文件中的示例 sn-p。

<?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 中并无需任何额外步骤即可部署的解决方案。

【问题讨论】:

  • 关于您的补充文件未应用于 web.config:来自 MSDN (msdn.microsoft.com/en-us/library/ms439965.aspx):“您可以通过运行 copyappbincontent Stsadm 命令追溯应用更改到服务器的 web.config 文件 -行操作。您必须在部署中的每个前端 Web 服务器上运行该操作。"
  • @Jason Weber - 就是这样,运行stsadm -o copyappbincontent 是缺失的部分......我想我对文档中的那一行感到震惊。如果您想将其添加为答案,我将为您提供此问题的功劳。

标签: c# sharepoint sharepoint-2010


【解决方案1】:

正如 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 包中。

【讨论】:

  • 感谢您的链接 - 我在尝试这种方法时遇到错误。我添加了一个单独的 SO 问题来跟踪此错误 @stackoverflow.com/questions/3478441/…
  • 这种方法似乎解决了华莱士的所有顾虑。如果节点下的条目顺序很重要,这可能不起作用,例如用于 HttpModule 注册。
【解决方案2】:

关于您的补充文件未应用于 web.config:来自MSDN:“您可以通过运行 copyappbincontent Stsadm 命令行操作追溯应用更改到服务器的 web.config 文件。您必须运行该操作在部署中的每个前端 Web 服务器上。”

【讨论】:

  • 请注意,此操作会将配置更改部署到机器上的所有 Web 应用程序。
【解决方案3】:

创建补充配置文件时,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 Weber 解决这个问题,但不幸的是,他将答案放在了评论中而不是问题中。

【讨论】:

    【解决方案4】:

    将其放入名为 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()
    

    然后用你的配置创建一个 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 配置选项并调用在第一个代码块中创建的函数:

    #read config mods from CSVs
    $mods = Import-CSV .\config\admin-common.webconfigmods.csv
    
    Write-Host "Applying configuration modifications"
    #add web config mods to sharepoint using powershell script
    &.\AddWebConfigMods "[sharepoint site url]" $mods
    &stsadm -o execadmsvcjobs
    

    【讨论】:

    • 感谢您的详细帖子。我会试试这个。
    • 这一切看起来都很棒,我相信它会起作用。但这仍然是一个额外的步骤。理想情况下,我希望将所有内容都捆绑在我的 1 个 wsp 包中,以便于客户端部署。
    • 如果有帮助,您只需运行脚本一次。之后,每次升级 wsp 时,SharePoint 都会为您应用 Web 配置修改。不过我听到了你的话,希望其他人能提出更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多