Spwebconfigmodifience Добавление дочерних узлов в нежелательном порядке
-
10-12-2019 - |
Вопрос
У меня есть какой-то код, который использует SPWebConfigmodification, чтобы добавить пару узлов в раздел System.WebServer / модулей. То, что я хочу сделать, это добавить генеракодицетагкод и затем генеракодицетагкод.
Независимо от того, что мне кажется, Web.config всегда заканчивается генеракодицетагкодом перед генеракодицетагкодом. Это, очевидно, неверно, так как модуль будет удален после его добавления. Что я хочу сделать, это удалить его, а затем добавить его. Вот что заканчивается web.config, выглядит как:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" type="[type full assembly path]" />
<remove name="MyModule" />
</modules>
</system.webServer>
</configuration>
.
Вот то, что я хочу, чтобы это было похоже:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="MyModule" />
<add name="MyModule" type="[type full assembly path]" />
</modules>
</system.webServer>
</configuration>
.
.. И вот код, который выполняется во время SPFEATURELERECEAVER.FEATURINSTALLED:
SPSecurity.RunWithElevatedPrivileges(delegate
{
SPWebService spWebService = SPWebService.ContentService;
var moduleModification = new SPWebConfigModification
{
Path = "configuration/system.webServer/modules",
Name = "remove[@name='MyModule']",
Sequence = 0,
Owner = "Sample",
Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
Value = "<remove name='MyModule' />",
};
spWebService.WebConfigModifications.Add(moduleModification);
spWebService.Update();
spWebService.ApplyWebConfigModifications();
moduleModification = new SPWebConfigModification
{
Path = "configuration/system.webServer/modules",
Name = "add[@name='MyModule'][@type='[type full assembly path]']",
Sequence = 1000,
Owner = "Sample",
Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
Value = "<add name='MyModule' type='type full assembly path' />",
};
spWebService.WebConfigModifications.Add(moduleModification);
spWebService.Update();
spWebService.ApplyWebConfigModifications();
});
.
... Я знаю, что я должен быть в состоянии сделать оба эти изменения перед вызовом обновления и applywebconfigmodifications, но просто имейте этот код здесь таким образом, потому что я не могу понять, почему он выясняет добавление выше Удалить. Почему это делает это таким образом? Это пытается в алфавитном состоянии узлы? Как я могу указать заказ?
Решение
Yes, the nodes are being alphabetically sorted and the Sequence
property only applies when the Name
property is exactly the same. To fix, use a little XPath trickery to get your nodes to sort in the correct order (first modules[1=1]
then modules[2=2]
):
SPSecurity.RunWithElevatedPrivileges(delegate
{
SPWebService spWebService = SPWebService.ContentService;
var moduleModification = new SPWebConfigModification
{
Path = "configuration/system.webServer",
Name = "modules[1=1]/remove[@name='MyModule']",
Sequence = 0,
Owner = "Sample",
Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
Value = "<remove name='MyModule' />",
};
spWebService.WebConfigModifications.Add(moduleModification);
moduleModification = new SPWebConfigModification
{
Path = "configuration/system.webServer",
Name = "modules[2=2]/add[@name='MyModule'][@type='[type full assembly path]']",
Sequence = 1000,
Owner = "Sample",
Type = SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode,
Value = "<add name='MyModule' type='type full assembly path' />",
};
spWebService.WebConfigModifications.Add(moduleModification);
spWebService.Update();
spWebService.ApplyWebConfigModifications();
});
Also, you might want to double check what happens when you call ApplyWebConfigModifications
to make sure your changes are propagated across the farm. Since you're calling it on an SPWebService I think it is OK but we always use the following:
webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
Sources: