c# sharepoint spsite

c# - SPSite.Exists(url) devuelve falso aunque la url existe



sharepoint (3)

El método SPSite.Exists verifica si la colección de sitios existe en la URL especificada. Pero devuelve false si la URL apunta a una subweb de una colección de sitios.

Dada la siguiente estructura:

http://server -> site collection http://server/web -> sub web http://server/sites/somesite -> site collection

SPSite.Exists(new Uri("http://server")) // returns true SPSite.Exists(new Uri("http://server/web")) // returns false SPSite.Exists(new Uri("http://server/sites/somesite")) // returns true

Si desea verificar si hay alguna web en la URL dada, debe usar el método SPSite.OpenWeb(string url, bool requireExactUrl) :

public static bool SiteExists(string url) { try { using (SPSite site = new SPSite(url)) { using (SPWeb web = site.OpenWeb(url, true)) { return true; } } } catch (FileNotFoundException) { return false; } }

El constructor de SPSite toma cualquier URL que apunte a un elemento secundario de la colección de sitios. Incluso si no hay ningún elemento en la ubicación determinada.

new SPSite("http://server/this/does/not/exist");

Este recorte devolverá la colección de sitios ubicada en http: // servidor .

Si bien esto es en la mayoría de las situaciones muy útil, hay situaciones en las que esto es peligroso. Considera el siguiente método:

public static void DeleteSite(string url) { new SPSite(url).Delete(); }

Si se llama a este método con http: // server / this / does / not / exist , se eliminará la colección de sitios más alta en http: // server .

¿Alguien sabe por qué SPSite.Exists(url) devuelve falso aunque la url existe .

Si reviso la declaración anterior, devuelve falso.

Pero puedo abrir el sitio sin ningún problema si uso directamente

SPSite myRootSite = new SPSite(url);

Aquí está mi codificación.

if (SPSite.Exists(new Uri(url))) { SPSite myRootSite = new SPSite(url); }

ACTUALIZAR:

Lo siento, estaba llamando a SharePoint desde una de las capas de mi empresa que no está permitida.

Mi culpa !!


En realidad, el método SPSite.Exists intenta crear un sitio a partir de su Url y prueba una excepción. Además, realiza una comparación de rutas que podría ser innecesaria para ti. Entonces, si creas tu propio método para verificar si el sitio existe, será mucho más que correcto.

este método podría parecerse

public static bool SiteExists(string path){ SPSite site; try{ site = new SPSite(path); } catch(FileNotFoundException e) { return false; } finally { if(site!=null) site.Dispose(); } return true; }


La respuesta de Stefan es casi correcta. Aquí está el código completo, que debería determinar correctamente, si existe un SPWeb en la URL dada:

public static bool WebExists(string absoluteUrl) { try { using (var site = new SPSite(absoluteUrl)) { using (var web = site.OpenWeb()) { return web.Exists; } } } catch (FileNotFoundException) { return false; } }