質問

SharePoint 2010の使用SPWEBCONFIGMODIFICATIONクラスを使用して、FarmのアプリケーションでWeb.Configファイルに基本的な変更を加えようとしています。変更:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
    {
        SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
        String ownerId = properties.Feature.DefinitionId.ToString();
        List<SPWebConfigModification> modsToAdd = new List<SPWebConfigModification>();

        #region Authentication Providers

        modsToAdd.Add(new SPWebConfigModification()
        {
            Name = "defaultProvider",
            Owner = ownerId,
            Path = "configuration/system.web/membership",
            Sequence = 0,
            Type = SPWebConfigModification.SPWebConfigModificationType.EnsureAttribute,
            Value = "FBA_AD_MP"
        });

        modsToAdd.Add(new SPWebConfigModification()
        {
            Name = "add [@name=\"FBA_AD_MP\"] [@type=\"System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\"] [@connectionStringName=\"ADFBAConnectionString\"] [@enableSearchMethods=\"true\"] [@attributeMapUsername=\"userPrincipalName\"]",
            Owner = ownerId,
            Path = "configuration/system.web/membership/providers",
            Sequence = 0,
            Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
            Value = "<add name=\"FBA_AD_MP\" type=\"System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" connectionStringName=\"ADFBAConnectionString\" enableSearchMethods=\"true\" attributeMapUsername=\"userPrincipalName\" />"
        });

        #endregion

        #region Connection Strings

        modsToAdd.Add(new SPWebConfigModification()
        {
            Name = "connectionStrings",
            Owner = ownerId,
            Path = "configuration",
            Sequence = 0,
            Type = SPWebConfigModification.SPWebConfigModificationType.EnsureSection,
            Value = "<connectionStrings />"
        });

        modsToAdd.Add(WebConfigModificationsUtility.CreateConnectionStringModification(ownerId, 1, "ADFBAConnectionString", properties.Feature.Properties["ADFBAConnectionString"].Value));

        #endregion

        WebConfigModificationsUtility.AddWebConfigModifications(webApp, modsToAdd.ToArray());
    }

WebConfigModificationSutilityクラスは、これらの機能レシーバーが共有するシンプルなユーティリティです。

public static void AddWebConfigModifications(SPWebApplication webApp, params SPWebConfigModification[] modificationsToAdd)
    {
        AddWebConfigModifications(webApp, true, modificationsToAdd);
    }
public static void AddWebConfigModifications(SPWebApplication webApp, Boolean persistChanges, params SPWebConfigModification[] modificationsToAdd)
    {
        foreach (SPWebConfigModification curMod in modificationsToAdd)
        {
            SPWebService.ContentService.WebApplications[webApp.Id].WebConfigModifications.Add(curMod);                
        }

        if (persistChanges)
        {
            PersistWebConfigModifications(webApp);
        }
    }
public static void PersistWebConfigModifications(SPWebApplication webApp)
    {
        SPWebService.ContentService.WebApplications[webApp.Id].Update();                        
        SPWebService.ContentService.ApplyWebConfigModifications();
    }

すべてがコンテンツアプリケーションで正常に動作していますが、中央の管理者Webアプリケーションで機能をアクティブにしようとすると、spwebConfigModificAtonアイテムはWeb.configファイルに書き込まれません。コードが例外なく実行されていることを確認しました。さらに、私の機能レシーバーは、修正を削除しようと試みます。

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
            String ownerId = properties.Feature.DefinitionId.ToString();
            WebConfigModificationsUtility.RemoveWebConfigModifications(webApp, ownerId);
        }
public static void RemoveWebConfigModifications(SPWebApplication webApp, String ownerId, Boolean persistChanges)
        {            
            RemoveWebConfigModifications(webApp, persistChanges, webApp.WebConfigModifications.Where(x => x.Owner == ownerId).ToArray());
        }
public static void RemoveWebConfigModifications(SPWebApplication webApp, Boolean persistChanges, params SPWebConfigModification[] modificationsToRemove)
        {
            foreach (SPWebConfigModification curMod in modificationsToRemove)
            {
                SPWebService.ContentService.WebApplications[webApp.Id].WebConfigModifications.Remove(curMod);                
            }

            if (persistChanges)
            {
                PersistWebConfigModifications(webApp);
            }
        }

このコードがCentral Admin Webアプリケーションで実行されると、機能のアクティベーションで作成された4つの変更が見つかり、それらを正常に削除しますが、 ない これらの操作は、実際にWebアプリケーションのweb.configファイルを変更しています。それは触れさえされていません、最後の編集日のタイムスタンプは全体を通して同じままです。

SpWebConfigModificationクラスの継承の厄介性について話しているさまざまなブログが見つかりました。ほとんどの問題は、名前と所有者のプロパティを適切に使用しているだけでなく、SpWebserviceの静的プロパティを使用して適切に変更を持続させますが、すべての推奨されるプラクティス。 APIにバグがあるのではないかと疑っていますが、SharePoint 2010でこれを正常に行ったのか、それとも反射器を開いて、何が得られるかを確認しようとするのかどうか疑問に思っています。

役に立ちましたか?

解決 2

Stack Overflowからの通知を受け取りましたが、この質問のバッジが視聴に基づいていると、Spoverflowでこの質問をしたことすら覚えていませんでした。

ポイントは、私もこの質問をして、そこで正しい答えを得たということです。

「Contentserviceと同様に、SpWebserviceにはWebApplicationsコレクションもあるAdministrationsサービスオブジェクトがあります。AmprantationServiceを使用して、CentralAdmin Webアプリケーションにアクセスしてください。」

https://stackoverflow.com/a/3919161/21418

他のヒント

この機能はWebアプリケーションスコープであると仮定しています。

ブラウザ(中央管理者)を介して機能をアクティブにしていますか?

代わりにPowerShell/STSADMからアクティブ化してみてください。 web.configを使用しているプロセスから、web.configを変更しようとすると、事態は悪くなるように見えることが常にわかりました。

function New-WebConfigMod {
    param(
        [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)][Microsoft.SharePoint.PowerShell.SPWebApplicationPipeBind]$WebApplication,
        [string]$path,
        [string]$name,
        [string]$owner,
        [string]$value,         
        [Microsoft.SharePoint.Administration.SPWebConfigModification+SPWebConfigModificationType]$type=[Microsoft.SharePoint.Administration.SPWebConfigModification+SPWebConfigModificationType]::EnsureChildNode
    )
    process {       
        $WebApp = $WebApplication.Read()

        $mod = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification 
        $mod.Path = $path;
        $mod.Name = $name;
        $mod.Sequence = 0;
        $mod.Owner = $owner;
        $mod.Type = $type;
        $mod.Value = $value;        
        $WebApp.WebConfigModifications.Add($mod) 
        $WebApp.Update() 
        $WebApp.WebService.ApplyWebConfigModifications();

        $WebApplication
    } 
} 

Get-SPWebApplication -IncludeCentralAdministration |? {
        $_.Url -eq "http://xyz:8080/"
    } | New-WebConfigMod -path "configuration" -name "connectionStrings" -owner "connectionStrings" -value "<connectionStrings></connectionStrings>" | 
        out-null

または、それを機能に変換します

webApp.WebConfigModifications.Add(curMod);
webApp.Update();
webApp.WebService.ApplyWebConfigModifications();  

よくわかりませんが、このコードを使用してみてください...

    public static void AddWebConfigModifications(SPWebApplication webApp, Boolean persistChanges, params SPWebConfigModification[] modificationsToAdd)    
    {
    foreach (SPWebConfigModification curMod in modificationsToAdd)
        {          
        webApp.WebConfigModifications.Add(curMod);
        webApp.Update();
        webApp.Farm.Services.GetValue<spwebservice></spwebservice>().ApplyWebConfigModifications();  
    }
.
.
.
}
ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top