12 May 2008
Видаляйте попередні зміни перед додаванням SPWebConfigModification
Сьогодні зіткнувся з цікавою ситуацією. В мене є SPFeatureReceiver який модифікує web.config. Вийшло так що при деактивації feature цей receiver не видалив попередні зміни. Наступна активація додала ще елементів (це, до речі, мій наступний баг ;)). Зрозуміло що веб додаток такого пережити не зміг...
Рішення
Просто видаляти попередні зміни. Для цього потрібно встановлювати унікальне значення для SPWebConfigModification.Owner. Тоді видалення попередніх елементів буде швидким і безболісним:
private static void CleanUpModificationsByOwnerId(
SPWebApplication application, string ownerIdentifier
)
{
List<SPWebConfigModification> modificationsToRemove
= application.WebConfigModifications.Where(
candidateModification =>
candidateModification.Owner.Equals(
ownerIdentifier, StringComparison.OrdinalIgnoreCase
)
).ToList();
foreach (SPWebConfigModification modification in modificationsToRemove)
{
application.WebConfigModifications.Remove(modification);
}
}
Наразі, можу викласти реалізацію ресівера що читає вже існуючий .confg файл і робить потрібні модифікаці. Це значно полегшує підтримку конфігурацій, в порівнянні коли всі зміни робляться прямо в ресівері, адже розробник бачить не велику кількість кода, а звийчаний конфіг.
Вчу українську, багато працюю. Цікавлюсь моделюванням небезпек. Більшість часу витрачаю на .Net.