Вопрос

В настоящее время я провожу некоторый тест, в котором пытаюсь удалить семейство сайтов программным путем.Таким образом, я осознал некоторое странное поведение SharePoint.

Я использовал следующий код для проверки удаления семейства сайтов.

private static void DeleteSiteCollection(string urlSiteToDelete)
{
    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
       SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://wssdev06"));
       webApp.Sites.Delete(urlSiteToDelete);                    
       webApp.Update();
    });
}

Поэтому, когда я вызываю метод с URL существующего семейства сайтов, семейство сайтов будет удалено, как и ожидалось.Но когда я вызываю метод с null, пустой строкой или URL-адресом, который не подключен к семейству сайтов, SharePoint удаляет семейство сайтов, которое находится в корневом каталоге (например http://wssdev06/).

Я не уверен, что я слишком глуп, чтобы использовать эту SPSiteCollection.Метод Delete() или если я не понял концепцию семейств сайтов и управляемых путей, но я думаю, что это действительно странное и настораживающее поведение.

Я мог бы повторить это поведение в другом веб-приложении, но у меня пока не было возможности протестировать его в другой среде SharePoint.

Итак, я делаю что-то неправильно или это ошибка?

Обновить:

Итак, я провел еще несколько исследований и понял, что это должно быть как-то связано с индексатором класса SPSiteCollection, который возвращает корневое семейство сайтов, если под данным URL-адресом нет семейства сайтов.Похоже на жука.

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

Решение

Всякий раз, когда вы просите SharePoint найти семейство сайтов по URL-адресу, лучше всего возвращать SPSite, даже если это означает, что ему придется игнорировать часть URL-адреса.

Иногда это очень хорошая вещь.ф.и.о.если у вас есть полный URL-адрес списка и вы хотите найти соответствующий SPSite и SPWeb.

Но это может быть очень опасно, например, когда вы удаляете семейства сайтов и, возможно, допускаете орфографическую ошибку.Если вы хотите убедиться, что получили нужное семейство сайтов, сначала найдите SPSite и убедитесь, что у SPSite, который вы получаете, есть нужный вам URL.

БР

За

Другие советы

Ваш код выглядит правильно.Одной из идей было бы добавить проверку семейства сайтов, чтобы убедиться, что сайт, который вы хотите удалить, находится в семействе сайтов.Я понимаю, что это не ответ на ваш вопрос.

Похоже, это именно та проблема, которая описана в KB 968,474 от Microsoft - stsadm может непреднамеренно удалить корневое семейство веб-сайтов, если используется ошибочный URL-адрес.Аналогично вашим симптомам при использовании stsadm - o restore: "Если URL-адрес указан неверно, то выполняется попытка удаления и восстановления по единственному допустимому пути, который является корневым семейством веб-сайтов URL".

Мне кажется, что в базовом API удаления сайта есть какая-то ошибка, как вы и подозревали.Возможно, алгоритм ищет "наиболее близкое совпадение", а не "точное совпадение".

Перечисление семейств сайтов и проверка точного соответствия могут быть лучшим способом избежать этого.Однако я бы не сказал, что вы делаете что-то неправильно, поскольку это очень близко к образцу кода Microsoft, а документация к функции не содержит предупреждений о передаче недопустимых URL-адресов.

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