سؤال

لدي بعض التعليمات البرمجية التي تستخدم 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();
});

...أعلم أنه من المفترض أن أكون قادرًا على إجراء هذين التغييرين قبل الاتصال بالتحديث و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