2010-08-10 62 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韋伯,但不幸的是,他把他的回答中而不是一個問題。