문제

SPWebConfigModification을 사용하여 system.webServer/modules 섹션에 몇 개의 노드를 추가하는 코드가 있습니다.내가하고 싶은 것은 <remove name="MyModule" /> 그리고 나서 <add name="MyModule" type="[type full assembly path]">.

내가 무엇을 하든 web.config는 항상 다음으로 끝납니다. <add ../> 전에 <remove ../>.모듈이 추가된 후 제거되므로 이는 분명히 잘못된 것입니다.내가하고 싶은 것은 그것을 제거한 다음 추가하는 것입니다.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>

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

...Update 및 ApplyWebConfigModifications를 호출하기 전에 이러한 변경 사항을 모두 수행할 수 있어야 한다는 것을 알고 있지만 추가 항목을 제거 항목 위에 두는 이유를 알 수 없기 때문에 이 코드를 여기에 이 ​​방식으로 포함합니다.왜 이런 식으로 하고 있는 걸까요?노드를 알파벳순으로 정렬하려고 합니까?주문을 어떻게 지정할 수 있나요?

도움이 되었습니까?

해결책

예, 노드는 알파벳순으로 정렬되고 있으며 Sequence 속성은 다음의 경우에만 적용됩니다. Name 속성은 똑같습니다.문제를 해결하려면 약간의 XPath 속임수를 사용하여 노드가 올바른 순서로 정렬되도록 합니다(먼저 modules[1=1] 그 다음에 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();
});

또한 전화를 걸면 어떤 일이 발생하는지 다시 확인하고 싶을 수도 있습니다. ApplyWebConfigModifications 변경 사항이 팜 전체에 전파되는지 확인하세요.SPWebService에서 호출하고 있으므로 괜찮다고 생각하지만 우리는 항상 다음을 사용합니다.

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

출처:

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top