Spwebconfigmodifience Добавление дочерних узлов в нежелательном порядке

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/94643

Вопрос

У меня есть какой-то код, который использует SPWebConfigmodification, чтобы добавить пару узлов в раздел System.WebServer / модулей. То, что я хочу сделать, это добавить генеракодицетагкод и затем генеракодицетагкод.

Независимо от того, что мне кажется, Web.config всегда заканчивается генеракодицетагкодом перед генеракодицетагкодом. Это, очевидно, неверно, так как модуль будет удален после его добавления. Что я хочу сделать, это удалить его, а затем добавить его. Вот что заканчивается web.config, выглядит как:

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

Вот то, что я хочу, чтобы это было похоже:

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

.. И вот код, который выполняется во время SPFEATURELERECEAVER.FEATURINSTALLED:

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

... Я знаю, что я должен быть в состоянии сделать оба эти изменения перед вызовом обновления и applywebconfigmodifications, но просто имейте этот код здесь таким образом, потому что я не могу понять, почему он выясняет добавление выше Удалить. Почему это делает это таким образом? Это пытается в алфавитном состоянии узлы? Как я могу указать заказ?

Это было полезно?

Решение

Yes, the nodes are being alphabetically sorted and the Sequence property only applies when the Name property is exactly the same. To fix, use a little XPath trickery to get your nodes to sort in the correct order (first modules[1=1] then 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();
});

Also, you might want to double check what happens when you call ApplyWebConfigModifications to make sure your changes are propagated across the farm. Since you're calling it on an SPWebService I think it is OK but we always use the following:

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

Sources:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top