SPSite.Exists () возвращает true, хотя семейство сайтов не существует

В настоящее время я работаю над TimerJob, который выполняет некоторое управление семействами сайтов. Когда задание выполняется, оно просматривает список, чтобы получить URL-адрес семейства веб-сайтов, затем вызывает SPSite.Exists(), чтобы проверить, существует ли еще сайт или нет.

Чтобы протестировать TimerJob, я удаляю семейство сайтов, но оставляю соответствующую запись в списке. Затем я запускаю TimerJob и просматриваю его код в режиме отладки. Когда доходит до проверки, существует ли сайт, SPSite.Exists() возвращает true.

Когда я запускаю TimerJob во второй раз для того же семейства сайтов, метод SPSite.Exists() возвращает false, как и должен.

Итак, теперь мне интересно, почему SPSite.Exists() возвращает ложный результат, когда я запускаю задание в первый раз. Может ли это быть вызвано кешированием?

Когда я запускаю один и тот же код вне TimerJob, SPSite.Exists() каждый раз возвращает правильный результат.


ОБНОВЛЕНИЕ

Итак, я провел еще немного отладки, и похоже, что эта проблема действительно вызвана каким-то механизмом кеширования, поскольку она не возникает, когда служба таймера Windows SharePoint Services была перезапущена после удаления тестового семейства сайтов и до запуска TimerJob.

На данный момент я не могу представить другого решения, кроме попытки получить доступ к удаленному сайту и перехвата исключения, которое будет выдано, чтобы определить, действительно ли сайт существует.


ОБНОВЛЕНИЕ 2

После еще нескольких тестов я понял, что проблема не возникает при первом вызове SPSite.Exists () (внутри TimerJob) после перезапуска службы таймера. Второй вызов (для другого семейства сайтов) по-прежнему приводит к известной проблеме.


ОБНОВЛЕНИЕ 3

На данный момент я использую уродливый хак для решения своей проблемы. Когда SPSite.Exists () возвращает true, хотя на самом деле он не существует, я создаю объект SPSite и пытаюсь спровоцировать FileNotFoundException, вызывая его свойство Usage. Когда возникают исключения, я знаю, что сайта не существует. Как ни странно, после того, как исключение было сгенерировано, SPSite.Exists () возвращает правильный результат (false).

Есть другие предложения?

Пока, Фло


person Flo    schedule 06.07.2009    source источник


Ответы (2)


Мне то же самое. У меня была аналогичная проблема после того, как я удалил семейство сайтов, и я все еще понял SPSite.Exists();. Странно было то, что если я открывал удаленный URL-адрес коллекции сайтов в браузере - первый запрос приводил к сообщению об ошибке HTTP 400, тогда как Второй запрос был ожидаемым HTTP 404.

Мое обходное решение состояло в том, чтобы просто создать HTTP GET для URL-адреса, чтобы создать первый запрос, а затем снова проверить существование сайта.

    private void touchWeb(string url, System.Net.ICredentials credentials)
    {
        try
        {
            Uri uri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Credentials = credentials;

            request.Method = "GET";
            string result = "";
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader readStream = new StreamReader(responseStream, System.Text.Encoding.UTF8))
                    {
                        result = readStream.ReadToEnd();
                    }
                }
            }
        }
        catch (Exception) { }
    }
person Henrik    schedule 23.07.2009
comment
По сравнению с моим решением (Обновление 3) ваше решение позволяет избежать исключения. Мне это нравится. Так что это было бы улучшением моего кода. - person Flo; 26.07.2009

У меня была такая же проблема, и я попробовал метод HTTP-запроса, но обнаружил, что он несколько медленный для одновременной проверки большого количества сайтов. Вместо этого я использовал что-то вроде этого:

public bool SPSiteExists(string url) {
    SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty);
    return SPSite.Exists(uri);
}
person katbyte    schedule 24.09.2012
comment
Похоже, кто-то со мной согласен. Если вам когда-нибудь случится создать пользователя в SharePoint Exchange, не стесняйтесь писать по этому вопросу. Кажется, ваше открытие старше моего (только что видел ваш вопрос сегодня, когда искал связи между этой проблемой и заданием постепенного удаления). Ссылка: sharepoint.stackexchange.com/questions/57553/ - person SPArcheon; 22.01.2013
comment
Нет нужды в благодарности. Я проголосовал и принял вашу версию. Я все еще сохраняю свой, потому что он содержит дополнительную информацию (материал отражателя) - хотя может преобразовать его в вики. - person SPArcheon; 24.01.2013