sábado, 6 de marzo de 2010

Error Access Denied al utilizar SPContext.Current.Web.Webs en SharePoint

Este error esta relacionado con SPContext y RunWithElevatedPrivileges.  SPContext debe de utilizarse a fuera del RunWithElevatedPrivileges y no se debe de utilizar el objeto SPWeb del contexto porque hará referencia al el nuevamente y nos indicará el error de acceso denegado en vez de ello utilice el ID que es de tipo GUID y a demás es más rápido para acceder los objetos SPSite y SPWeb.

Por último utilice la propiedad AllowUnsafeUpdates de los objetos SPSite y SPWeb dentro del código para indicar que no verifique los permisos de las operaciones que va a realizar.  No esta de mas recordarle la recomendación cuando instancia los objetos SPSite y SPWeb utilice using para que ejecute el método Dispose() cuando deje de utilizarlos y libere la memoria adecuadamente.

Nota: Siempre prefiero utilizar objetos livianos para manipular la información que deseo desplegar dentro de los elementos Web y así evitar el desperdicio de memoria que sucede cuando devolvemos un objeto de SharePoint.  Por ello usted verá en el ejemplo que devuelvo una lista de una clase llamada InformacionSitio.

Los dejo con el código abajo…Code4Fun!,

Manolo Herrera

 private IList<InformacionSitio> ObtenerInformacionSitio()
        {
            IList<InformacionSitio> listadoSitios = new List<InformacionSitio>();
            var idSitio = SPContext.Current.Site.ID;
            var idWeb = SPContext.Current.Web.ID;
            SPSecurity.RunWithElevatedPrivileges(delegate
            {
                using (SPSite miSitio = new SPSite(idSitio))
                {
                    miSitio.AllowUnsafeUpdates = true;
                    using (SPWeb miWeb = miSitio.OpenWeb(idWeb))
                    {
                        miWeb.AllowUnsafeUpdates = true;
                        foreach (SPWeb webActual in miWeb.Webs)
                        {
                            try
                            {
                                var sitioObtenido = _informacionSitioRepo.ObtenerSitio(this, webActual.Url, true);
                                if (sitioObtenido != null && sitioObtenido.Visible) listadoSitios.Add(sitioObtenido);
                            }
                            finally
                            {
                                if (webActual != null)
                                    webActual.Dispose();
                            }
                        }
                        miWeb.AllowUnsafeUpdates = false;
                    }
                    miSitio.AllowUnsafeUpdates = false;
                }
            });
            return listadoSitios;
        }

No hay comentarios.: