Класс spwebconfigmodification не будет обновлять файл Central Admin Application Web.Config
Вопрос
Использование 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);
}
}
Когда этот код запускается в веб -приложении центрального администратора, он находит четыре модификации, которые были созданы в активации функции, и успешно их удаляет, но ни один Эти операции фактически изменяют файл web.config веб -приложения; Это даже не тронуто, отпечатка времени для последней отредактированной даты остается прежней повсюду.
Я обнаружил, что различные блоги рассказывают о наследственной хитрости класса spwebconfigmodification, причем большинство проблем правильно используются с использованием имени и свойств владельца, а также правильно сохраняют изменения, используя статические свойства Spwebservice, но, насколько я могу сказать, я следую. Все рекомендуемые практики. Я начинаю подозревать, что в API есть ошибка, но мне интересно, успешно ли кто -нибудь сделал это в SharePoint 2010 или я должен взломать открытый отражатель и попытаться увидеть, что дает?
Решение 2
Я только что получил уведомление от переполнения стека о том, что я получил значок для этого вопроса, основанный на взглядах, и я даже не помнил, чтобы задавал этот вопрос о Spoverflow, потому что в то время его не существовало.
Дело в том, что я также задал этот вопрос, и получил правильный ответ:
«Точно так же, как Contentservice, Spwebservice имеет объект Administrationservice, который также имеет сбор WebPplications. Используйте Administrationservice, чтобы добраться до ваших веб -приложений CentralAdmin».
Другие советы
Я предполагаю, что эта функция предназначена для веб -приложений.
Вы активируете эту функцию через браузер (центральный администратор)?
Попробуйте активировать его из 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();
}
.
.
.
}