Класс SPWebConfigModification не будет обновлять файл web.config приложения Central Admin - PullRequest
0 голосов
/ 04 октября 2010

Использование SharePoint 2010 Я пытаюсь использовать класс SPWebConfigModification для внесения некоторых основных изменений в файлы web.config в приложениях в ферме, в том числе в файл 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();
    }

Все отлично работает с приложениями контента, но при попытке активировать функциив веб-приложении центрального администратора элементы SPWebConfigModificaiton никогда не записываются в файлы 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.config веб-приложения;это даже не трогается, отметка времени для последней отредактированной даты остается неизменной повсюду.

Я обнаружил, что в различных блогах рассказывается о хитрости наследования класса SPWebConfigModification, при этом большинство проблем связано с правильным использованием имени и владельца.свойства, а также правильно сохраняющиеся изменения с использованием статических свойств SPWebService, но, насколько я могу судить, я следую всем рекомендуемым методам.Я начинаю подозревать, что в API есть ошибка, но мне интересно, если бы кто-то сделал это в SharePoint 2010 успешно или мне следует взломать Reflector и попытаться выяснить, что дает?

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Как и ContentService, SPWebService имеет объект AdministrationService, который также имеет коллекцию WebApplications. Используйте Service Administration для доступа к веб-приложениям CentralAdmin.

0 голосов
/ 05 октября 2010

SPWebConfigMondification не будет обновлять веб-сайт центра администрирования.

...