Question

J'ai un code qui utilise SPWebConfigModification pour ajouter un couple de nœuds dans le système.webServer/section modules.Ce que je veux faire est d'ajouter un <remove name="MyModule" /> et puis un <add name="MyModule" type="[type full assembly path]">.

Peu importe ce que je semble faire, le web.config finit toujours avec la <add ../> avant l' <remove ../>.C'est évidemment inexacte, car le module sera supprimé après est ajoutée.Ce que je veux faire est de le supprimer, puis l'ajouter.Voici ce que le web.config finit par ressembler à:

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

Voici ce que je veux qu'il ressemble:

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

..et voici le code qui est exécuté au cours de 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();
});

...Je sais que je suis censé être en mesure de faire à la fois de ces changements avant l'appel à la mise à Jour et ApplyWebConfigModifications, mais juste avoir ce code dans ici de cette façon parce que je ne peux pas comprendre pourquoi il est en train de mettre les ajouter au-dessus de la supprimer.Pourquoi est-il en train de faire de cette façon?Est-il en essayant de classer par ordre alphabétique les nœuds?Comment puis-je spécifier l'ordre?

Était-ce utile?

La solution

Oui, les nœuds sont triés par ordre alphabétique et l' Sequence la propriété s'applique uniquement lorsque la Name la propriété est exactement le même.Pour corriger, utilisez un peu de XPath la ruse pour obtenir votre nœuds pour trier dans l'ordre correct (premier modules[1=1] alors 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();
});

Aussi, vous pourriez vouloir vérifier ce qui se passe lorsque vous appelez ApplyWebConfigModifications pour vous assurer que vos modifications sont propagées à travers la ferme.Puisque vous êtes en l'appelant sur un SPWebService je pense que c'est OK, mais nous utilisons toujours les suivantes:

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

Sources:

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top