원하지 않는 순서로 하위 노드를 추가하는 SPWebConfigModification
-
10-12-2019 - |
문제
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();
출처: