2009-07-06 14 views
6

Actualmente estoy trabajando en un TimerJob que hace una cierta gestión de colecciones de sitios. Cuando el trabajo se ejecuta busca en una lista para recuperar la URL de una colección de sitios, llama al SPSite.Exists() para verificar si el sitio aún existe o no.SPSite.Exists() devuelve verdadero aunque la colección de sitios no existe

Para probar la TimerJob elimino una colección de sitios, pero dejó la entrada correspondiente en la lista. Entonces comienzo el TimerJob y paso por su código en modo de depuración. Cuando se trata del punto para verificar si el sitio existe, SPSite.Exists() devuelve verdadero.

Cuando ejecuto TimerJob por segunda vez para la misma colección de sitios, el método SPSite.Exists() devuelve falso como debería.

Así que ahora me pregunto por qué SPSite.Exists() devuelve el resultado falso cuando corro el trabajo por primera vez. ¿Podría ser causado por el almacenamiento en caché?

cuando corro el mismo código fuera de la TimerJob SPSite.Exists() devuelve el resultado correcto en todo momento.


ACTUALIZACIÓN

Así que he hecho un poco más la depuración y parece que este problema es realmente causado por algún mecanismo de caché, ya que no se produce cuando el servicio de temporizador de Windows SharePoint Services se ha reiniciado después de la la colección del sitio de prueba se ha eliminado y antes de que se haya iniciado TimerJob.

Por el momento no puedo imaginar otra solución que intentar acceder al sitio eliminado y atrapar la excepción de que sea destruida para determinar si el sitio realmente existe.


ACTUALIZACIÓN 2

Después de algunas pruebas más me di cuenta de que el problema no se produce para la primera llamada de SPSite.Exists() (dentro del TimerJob) después de que el servicio de temporizador se reinicia. La segunda llamada (para una colección de sitios diferente) todavía conduce al problema conocido.


ACTUALIZACIÓN 3

En este momento estoy usando un truco feo para resolver mi problema. Cuando SPSite.Exists() devuelve verdadero aunque en realidad no existe, creo un objeto SPSite y trato de provocar una excepción FileNotFoundException llamando a su propiedad de uso. Cuando surgen las excepciones, sé que el sitio no existe. Por extraño que parezca después de que se lanzó la excepción SPSite.Exists() devuelve el resultado correcto (falso).

¿Alguna otra sugerencia por ahí?

adiós, Flo

Respuesta

4

Lo mismo para mí. Tuve un problema similar después de que eliminé una colección de sitios. Todavía me cumplí para SPSite.Exists(); Lo extraño era que si abrí la URL de colección de sitios eliminados en un navegador, la primera solicitud daba como resultado un mensaje de error HTTP 400, mientras que la segunda solicitud fue el esperado HTTP 404.

Mi solución fue simplemente crear un HTTP GET para que la URL creara la primera solicitud y luego verificara la existencia del sitio nuevamente.

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

Comparado con mi solución (Actualización 3), su solución evita detectar una excepción. Me gusta esto. Entonces esto sería una mejora para mi código. – Flo

5

Tuve el mismo problema e intenté con el método de solicitud HTTP, pero me pareció algo lento para verificar una gran cantidad de sitios a la vez. En su lugar terminé usando algo como esto:

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

Parece que alguien está de acuerdo conmigo. Si alguna vez crea un usuario en SharePoint Exchange, no dude en publicar en esta pregunta. Su descubrimiento parece ser más antiguo que el mío (solo vi su pregunta hoy, mientras buscaba relaciones entre este problema y el trabajo de eliminación gradual). Enlace: http://sharepoint.stackexchange.com/questions/57553/spsite-exists-returning-true-for-a-just-deleted-site-collection – SPArchaeologist

+0

gracias, lo he hecho – katbyte

+0

No hay necesidad de gracias. He votado y acepté tu versión. Todavía conservo el mío por ahora porque contiene algo más de información (material reflector). Sin embargo, puede convertirlo en wiki. – SPArchaeologist

Cuestiones relacionadas