2009-07-06 12 views
6

Attualmente sto lavorando su un TimerJob che gestisce alcune raccolte siti. Quando il lavoro viene eseguito, esamina un elenco per recuperare l'URL di una raccolta siti, quindi chiama SPSite.Exists() per verificare se il sito esiste ancora o meno.SPSite.Exists() restituisce true anche se la raccolta siti non esiste

Per provare TimerJob, eliminare una raccolta siti ma ho lasciato la voce corrispondente nell'elenco. Quindi avvio TimerJob e passo il suo codice in modalità di debug. Quando si giunge al punto di verificare se il sito esiste, SPSite.Exists() restituisce true.

Quando si esegue il TimerJob una seconda volta per la stessa raccolta siti, il metodo restituisce false come dovrebbe.

Così ora mi chiedo perché SPSite.Exists() restituisce il risultato falso quando eseguo il lavoro per la prima volta. Potrebbe essere causato dal caching?

Quando eseguo lo stesso codice all'esterno di TimerJob, SPSite.Exists() restituisce sempre il risultato corretto.


UPDATE

così ho fatto un po 'di debug e sembra che questo problema è in realtà causato da un qualche meccanismo di caching in quanto non si verifica quando il servizio Timer di Windows SharePoint Services è stato riavviato dopo la la raccolta del sito di test è stata cancellata e prima dell'avvio di TimerJob.

Al momento non riesco a immaginare un'altra soluzione se non tentare di accedere al sito eliminato e rilevare l'eccezione che verrà generata per determinare se il sito esiste realmente.


UPDATE 2

Dopo qualche test ho capito che il problema non si verifica per la prima chiamata di SPSite.Exists() (nel TimerJob) dopo Timer Service viene riavviato. La seconda chiamata (per una diversa raccolta siti) porta ancora al problema noto.


UPDATE 3

Al momento sto utilizzando un brutto hack per risolvere il mio problema. Quando SPSite.Exists() restituisce true anche se in realtà non esiste, creo un oggetto SPSite e provo a provocare un oggetto FileNotFoundException chiamando la sua proprietà Usage. Quando sorgono le eccezioni, so che il sito non esiste. Stranamente dopo che l'eccezione è stata lanciata, SPSite.Exists() restituisce il risultato corretto (false).

Altri suggerimenti là fuori?

Bye, Flo

risposta

4

stesso per me. Ho avuto un problema simile dopo aver cancellato una raccolta di siti che avevo ancora true per SPSite.Exists(); La cosa strana era che, se avessi aperto l'URL della raccolta siti cancellato in un browser, la prima richiesta si risolveva in un messaggio di errore HTTP 400, mentre la seconda richiesta era l'HTTP 404 previsto.

La soluzione alternativa era creare semplicemente un GET HTTP per l'URL per creare la prima richiesta e quindi controllare di nuovo l'esistenza del sito.

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

Rispetto alla mia soluzione (Update 3) la soluzione evita di rilevare un'eccezione. Mi piace questo. Quindi questo sarebbe un miglioramento del mio codice. – Flo

5

Ho avuto questo stesso problema e provato il metodo di richiesta HTTP, ma c'è sembrato un po 'lento per il controllo di un gran numero di siti contemporaneamente. Invece ho finito per usare qualcosa del genere:

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

Sembra che qualcuno sia d'accordo con me. Se ti capita di creare un utente su SharePoint Exchange, sentiti libero di postare questa domanda. La tua scoperta sembra essere più vecchia della mia (hai appena visto la tua domanda oggi, mentre cercavi le relazioni tra questo problema e il processo di cancellazione graduale). Link: http://sharepoint.stackexchange.com/questions/57553/spsite-exists-returning-true-for-a-just-deleted-site-collection – SPArchaeologist

+0

grazie, ho fatto così – katbyte

+0

Non c'è bisogno di ringraziamenti. Ho votato e accettato la tua versione. Per il momento sto ancora conservando il mio perché contiene alcune informazioni in più (cosa di reflector) - potrebbe comunque convertirlo in wiki. – SPArchaeologist