Question

Utilisation de SharePoint 2010 Je suis en train d'utiliser la classe SPWebConfigModification pour apporter quelques modifications de base aux fichiers web.config sur les applications de la batterie, y compris le fichier Administration centrale web.config en utilisant l'application Web SCOPED fonctionnalités avec les récepteurs de fonction de gestion de l'ajout / la suppression des modifications:

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());
    }

La classe WebConfigModificationsUtility est un utilitaire simple partagé par ces récepteurs de fonction:

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();
    }

Tout fonctionne bien sur des applications de contenu, mais en essayant de caractéristiques réactivant à l'application Web d'administration centrale, les éléments SPWebConfigModificaiton ne sont jamais écrites dans les fichiers web.config. J'ai vérifié que le code est exécuté sans exception. De plus, mes tentatives de récepteur de fonctionnalité pour supprimer toute modification est faite sur la désactivation avait:

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);
            }
        }

Lorsque ce code se exécute sur l'application Web Central Admin il trouve les quatre modifications qui ont été créés dans l'activation des fonctionnalités et les supprime avec succès, mais ni de ces opérations est en train de changer réellement le fichier web.config de l'application web; il est même pas touché, l'horodatage pour la dernière mise à jour Date reste le même partout.

J'ai trouvé divers blogs qui parlent de la rouerie Hériter de la classe SPWebConfigModification, la plupart des problèmes étant autour de l'utilisation correctement les propriétés Nom et le propriétaire, ainsi que correctement la persistance des changements en utilisant les propriétés statiques SPWebService, mais mieux que je peux dire que je 'M suivant toutes les pratiques recommandées. Je commence à croire qu'il ya un bogue dans l'API, mais je me demande si quelqu'un a fait cela dans SharePoint 2010 avec succès ou si je dois casser réflecteur ouvert et essayer de voir ce qui se passe?

Était-ce utile?

La solution 2

Je viens de recevoir une notification de débordement de la pile que je suis un badge pour cette question en fonction de points de vue, et je ne me souviens même pas avoir posé cette question sur SPOverflow, parce qu'il n'a pas vraiment existé à l'époque.

Le point est, j'ai demandé aussi cette question sur le SO et suis arrivé là une réponse correcte:

"Tout comme ContentService, SPWebService a un objet AdministrationService qui a aussi une collection de webapplications. Utilisez le AdministrationService pour accéder à vos applications Web CENTRALADMIN."

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

Autres conseils

Je suppose que la fonction est l'application Web scope.

Êtes-vous d'activer la fonction via le navigateur (admin central)?

Essayez l'activer à partir Powershell / stsadm à la place. Je l'ai toujours trouvé que si je tente de modifier le web.config, du processus qui utilise le web.config, les choses semblent aller mal.

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

ou de les convertir à votre fonction

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

Pas vraiment sûr mais essayez d'utiliser ce code ...

    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();  
    }
.
.
.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top