Frage

Ich habe einen Code, der SPWebConfigModification verwendet, um dem System ein paar Knoten hinzuzufügen.Abschnitt webServer/Module.Was ich tun möchte, ist ein hinzuzufügen <remove name="MyModule" /> und dann ein <add name="MyModule" type="[type full assembly path]">.

Egal was ich zu tun scheine, das Web.die Konfiguration endet immer mit dem <add ../> vor dem <remove ../>.Dies ist offensichtlich falsch, da das Modul nach dem Hinzufügen entfernt wird.Was ich tun möchte, ist es zu entfernen und dann hinzuzufügen.Hier ist was das Web.die Konfiguration sieht am Ende so aus:

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

Hier ist, wie es aussehen soll:

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

..und hier ist der Code, der während SPFeatureReceiver ausgeführt wird.Funktioninstalliert:

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();
});

...Ich weiß, dass ich in der Lage sein soll, diese beiden Änderungen vorzunehmen, bevor ich Update und ApplyWebConfigModifications aufrufe, aber ich habe diesen Code nur auf diese Weise hier, weil ich nicht herausfinden kann, warum das Hinzufügen über das Entfernen gesetzt wird.Warum macht es das so?Versucht es, die Knoten zu alphabetisieren?Wie kann ich die Bestellung spezifizieren?

War es hilfreich?

Lösung

Ja, die Knoten werden alphabetisch sortiert und die Sequence eigentum gilt nur, wenn die Name eigentum ist genau das gleiche.Verwenden Sie zum Beheben einen kleinen XPath-Trick, damit Ihre Knoten in der richtigen Reihenfolge sortiert werden (zuerst modules[1=1] dann 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();
});

Vielleicht möchten Sie auch noch einmal überprüfen, was passiert, wenn Sie anrufen ApplyWebConfigModifications um sicherzustellen, dass Ihre Änderungen in der gesamten Farm weitergegeben werden.Da Sie es auf einem SPWebService aufrufen, denke ich, dass es in Ordnung ist, aber wir verwenden immer Folgendes:

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

Hauptquellen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top