Encontrar las páginas que hacen Crash!!

Aunque las buenas prácticas dicen que deberíamos de tener pruebas unitarias para validar que nuestro código tiene un comportamiento correcto durante todo el ciclo de vida del desarrollo, en el caso de SharePoint nos podemos encontrar con que puede que nuestros componentes estén correctamente pero haya otros elementos que impidan la ejecución provocando errores fatales. Si disponemos de Visual Studio 2010 Ultimate dispondremos de los WebTest con los que realizar una prueba sobre las páginas en un entorno de integración.

El problema nos puede venir porque no dispongamos de esta versión o porque no hayamos creado pruebas unitarias durante todo el proyecto. Para poder identificar al menos las páginas que están dando problemas al desplegar nuestras soluciones, podemos realizar peticiones GET a todas las páginas de nuestras colecciones de sitio y comprobar que no nos devuelva una excepción o la cabecera HTTP “SharePointError”. Esta cabecera se añade automáticamente en las repuestas a páginas que han generado un error no controlado.

 

Os dejo un pequeño ejemplo de código de como hacer este proceso, muy útil en migraciones 😉

 

static bool BuscarErrorAlCargarPagina(SPSite Site, List<string> ErroresEncontrados)
        {
            Console.WriteLine("BuscarErrorAlCargarPagina…");

            bool res = false;
            try
            {
                foreach (SPWeb web in Site.AllWebs)
                {
                    try
                    {
                            PublishingWeb pubWeb = PublishingWeb.GetPublishingWeb(web);
                            foreach (PublishingPage page in pubWeb.GetPublishingPages())
                            {
                                string url = string.Format("{0}/{1}", pubWeb.Url, page.Url);
                                try
                                {
                                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
                                    req.PreAuthenticate = true;
                                    req.Credentials = CredentialCache.DefaultNetworkCredentials;

                                    byte[] result = null;
                                    byte[] buffer = new byte[4096];

                                    using (WebResponse resp = req.GetResponse())
                                    using (Stream responseStream = resp.GetResponseStream())
                                    using (MemoryStream memoryStream = new MemoryStream())
                                    {
                                        int count = 0;
                                        do
                                        {
                                            count = responseStream.Read(buffer, 0, buffer.Length);
                                            memoryStream.Write(buffer, 0, count);

                                        } while (count != 0);

                                        result = memoryStream.ToArray();

                                        if (result.Length < 1)
                                            ErroresEncontrados.Add(string.Format("Error al recibir datos de página {0}", page.Url));
                                        else if (resp.Headers["SharePointError"] != null)
                                        {
                                            ErroresEncontrados.Add(string.Format("Error al procesar página {0} correlation {1}", url, resp.Headers["SPRequestGuid"]));

                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    ErroresEncontrados.Add(string.Format("Error al cargar página {0}", url));
                                }
                            }
                    }
                    finally
                    {
                        web.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                ErroresEncontrados.Add(string.Format("Error BuscarErrorAlCargarPagina: {0}", ex.Message));
            }
            return res;
        }

Publicado por

Mario Cortés

Mario Cortés Flores es MVP en Office 365, trabaja en Plain Concepts como Team Lead y escribe habitualmente en geeks.ms/blogs/mcortes y en Twitter @mariocortesf. Podréis encontrarlo colaborando activamente con la comunidad de MadPoint y SUGES

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *