Pregunta

Tengo un código que usa SPWebConfigModification para agregar un par de nodos a la sección system.webServer/modules.Lo que quiero hacer es agregar un <remove name="MyModule" /> y luego un <add name="MyModule" type="[type full assembly path]">.

Sin embargo, no importa lo que parezca hacer, web.config siempre termina con el <add ../> antes de <remove ../>.Obviamente, esto es incorrecto, ya que el módulo se eliminará después de agregarlo.Lo que quiero hacer es eliminarlo y luego agregarlo.Así es como termina viéndose web.config:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <add name="MyModule" type="[type full assembly path]" />
            <remove name="MyModule" />
        </modules>
    </system.webServer>
</configuration>

Así es como quiero que se vea:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="MyModule" />
            <add name="MyModule" type="[type full assembly path]" />
        </modules>
    </system.webServer>
</configuration>

..y aquí está el código, que se ejecuta 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();
});

...Sé que se supone que debo poder realizar ambos cambios antes de llamar a Update y ApplyWebConfigModifications, pero solo tengo este código aquí de esta manera porque no puedo entender por qué coloca agregar encima de eliminar.¿Por qué lo hace de esta manera?¿Está intentando alfabetizar los nodos?¿Cómo puedo especificar el pedido?

¿Fue útil?

Solución

Sí, los nodos se ordenan alfabéticamente y el Sequence propiedad sólo se aplica cuando el Name La propiedad es exactamente la misma.Para solucionarlo, utilice un pequeño truco de XPath para que los nodos se clasifiquen en el orden correcto (primero modules[1=1] entonces 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();
});

Además, es posible que desees volver a verificar qué sucede cuando llamas. ApplyWebConfigModifications para asegurarse de que sus cambios se propaguen por toda la granja.Como lo llamas en un SPWebService, creo que está bien, pero siempre usamos lo siguiente:

webApp.Farm.Services.GetValue<SPWebService>().ApplyWebConfigModifications();

Fuentes:

Licenciado bajo: CC-BY-SA con atribución
scroll top