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?

Foi útil?

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:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a sharepoint.stackexchange
scroll top