SPWebConfigModification adição de criança nós não desejadas, a fim
-
10-12-2019 - |
Pergunta
Eu tenho um código que usa SPWebConfigModification para adicionar um par de nós para o sistema.webServer/módulos de seção.O que eu quero fazer é adicionar um <remove name="MyModule" />
e, em seguida, uma <add name="MyModule" type="[type full assembly path]">
.
Não importa o que eu consigo fazer, porém, a web.config termina sempre com a <add ../>
antes de o <remove ../>
.Obviamente, isso é incorreto, como o módulo será removido depois de adicionado.O que eu quero fazer é remover e, em seguida, adicioná-lo.Aqui está o que é a web.config acaba parecendo:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" type="[type full assembly path]" />
<remove name="MyModule" />
</modules>
</system.webServer>
</configuration>
Aqui está o que eu quero olhar para ele como:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="MyModule" />
<add name="MyModule" type="[type full assembly path]" />
</modules>
</system.webServer>
</configuration>
..e aqui está o código que é executado durante SPFeatureReceiver.FeatureInstalled:
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();
});
...Eu sei que eu devo ser capaz de fazer ambas estas alterações antes de chamar Atualização e ApplyWebConfigModifications, mas só tem esse código aqui dessa maneira porque eu não consigo descobrir por que ele está colocando a adicionar acima a remover.Por que é fazê-lo desta forma?É ele tentando colocar em ordem alfabética nós?Como posso especificar a ordem?
Solução
Sim, os nós são classificados em ordem alfabética e a Sequence
propriedade aplica-se apenas quando o Name
propriedade é exatamente o mesmo.Para correção, use um pouco de XPath artimanhas para obter o seu nós para classificar em ordem correta (primeiro modules[1=1]
em seguida, 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();
});
Além disso, você pode querer verificar o que acontece quando você chamar ApplyWebConfigModifications
para garantir que as alterações são propagadas por todo o farm.Uma vez que você está chamando-a em um SPWebService eu acho que é OK, mas nós sempre usar o seguinte:
webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();
Fontes: