2009-07-06 3 views
6

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

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

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

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

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


UPDATE

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

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


UPDATE 2

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


UPDATE 3

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

Любые другие предложения?

Bye, Flo

ответ

4

То же самое для меня. У меня была аналогичная проблема после того, как я удалил сайт-сборник. Я по-прежнему получил значение для 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) { } 
    } 
+0

По сравнению с моим решением (обновление 3) ваше решение позволяет избежать исключения. Мне это нравится. Так что это будет улучшение моего кода. – Flo

5

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

public bool SPSiteExists(string url) { 
    SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty); 
    return SPSite.Exists(uri); 
} 
+0

Кажется, что кто-то согласен со мной. Если вы когда-нибудь создадите пользователя на SharePoint Exchange, не стесняйтесь публиковать сообщения по этому вопросу. Ваше открытие, похоже, старше меня (просто увидел ваш вопрос сегодня, ища отношения между этой проблемой и работой по постепенному удалению). Ссылка: http://sharepoint.stackexchange.com/questions/57553/spsite-exists-returning-true-for-a-just-deleted-site-collection – SPArchaeologist

+0

спасибо, я сделал так – katbyte

+0

Не нужно благодарить. Я проголосовал и принял вашу версию. Я все еще держу свою руку, потому что она содержит некоторую дополнительную информацию (отражатель) - может преобразовать ее в wiki. – SPArchaeologist

 Смежные вопросы

  • Нет связанных вопросов^_^