Domanda

Utilizzando SharePoint 2010 Sto cercando di utilizzare la classe SPWebConfigModification di apportare alcune modifiche di base ai file web.config sulle applicazioni della farm, incluso il file web.config Amministrazione centrale utilizzando l'applicazione web di ambito caratteristiche con funzionalità ricevitori gestire l'aggiunta / rimozione delle modifiche:

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 è una semplice utility condivisa da questi ricevitori caratteristica:

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

Tutto sta funzionando benissimo su applicazioni di contenuti, ma quando si tenta di funzioni attivate sulla applicazione di amministrazione web centrale, gli elementi SPWebConfigModificaiton non sono mai scritti nei file web.config. Ho verificato che il codice è in esecuzione, senza eccezioni. Inoltre, la mia caratteristica tentativi ricevitore per rimuovere eventuali modifiche si avevano fatto durante la disattivazione:

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

Quando questo codice viene eseguito sul applicazione web Central Admin che trova le quattro modifiche che sono stati creati l'attivazione funzione e con successo li rimuove, ma non di queste operazioni sta effettivamente cambiando il file web.config dell'applicazione web; non è nemmeno toccato, il timestamp per ultima data modificata rimane la stessa per tutto.

ho trovato vari blog parlando del accorgimenti eredita della classe SPWebConfigModification, con la maggior parte dei problemi di essere intorno correttamente utilizzando le proprietà del nome e proprietario, così persistente come correttamente le modifiche utilizzando le proprietà SPWebService statiche, ma come meglio posso dire che 'sto seguendo tutte le pratiche raccomandate. Sto cominciando a sospettare che ci sia un bug nel API, ma mi chiedo se qualcuno ha fatto questo in SharePoint 2010 con successo o se devo crepa aperta Reflector e provare a vedere che cosa dà?

È stato utile?

Soluzione 2

Ho appena ricevuto una notifica da Stack Overflow che ho avuto un badge per questa domanda sulla base di punti di vista, e non mi ricordo nemmeno questa domanda su SPOverflow, perché lo ha fatto in realtà non esiste al momento.

Il punto è, ho anche fatto questa domanda su SO e ottenuto una risposta corretta non:

"Proprio come contentService, SPWebService ha un oggetto AdministrationService che ha anche una collezione di applicazioni web. Utilizzare l'AdministrationService per arrivare alle applicazioni web CENTRALADMIN".

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

Altri suggerimenti

Io parto dal presupposto che la funzione è un'applicazione web ambito.

Stai attivando la funzione attraverso il browser (admin centrale)?

Prova attivandolo da PowerShell / stsadm invece. Ho sempre trovato che se provo a modificare il web.config, dal processo che utilizza il file web.config, le cose sembrano andare male.

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

o Converti che alla vostra caratteristica

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

Non realmente sicuro, ma provare a utilizzare questo codice ...

    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();  
    }
.
.
.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top