miércoles, 23 de septiembre de 2015

¿Cómo eliminar manejadores de eventos huérfanos con C# en SharePoint?

Arquitectura de la solución
  • Un sitio raíz
  • Varios sitios hijos
  • Tipos de contenido en el sitio raíz
  • Listas en los sitios hijos que consumen los tipos de contenido del sitio raíz
  • Manejadores de eventos asociados a los tipos de contenido del sitio raíz en forma programática:



El problema

Se presenta un error al tratar de eliminar los eventos asociados el tipo de contenido, propagando el cambio hacia los tipos de contenido descendientes:




El error

Mensaje: Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. Operación no válida dado el estado actual del objeto. 

Stack trace: en Microsoft.SharePoint.SPContentType.PushDownChanges(CodeToPushDownChangesToDerivedCT derivedCTPushdownCode, CodeToPushDownChangesToListCTs listDerivedCTsPushdownCode, Boolean throwOnSealedOrReadOnly, IList`1 exceptions) en Microsoft.SharePoint.SPContentType.UpdateOnWeb(Boolean bPushdown, Boolean ignoreSealedOrReadOnly, Boolean bThrowOnSealedOrReadOnly, Boolean bSetNextChildByteToZero, IList`1 exceptions) en Microsoft.SharePoint.SPContentType.Update(Boolean updateChildren, Boolean ignoreSealedOrReadOnly, Boolean throwOnSealedOrReadOnly, IList`1 exceptions) en Microsoft.SharePoint.SPContentType.Update(Boolean updateChildren, Boolean throwOnSealedOrReadOnly) en EMP_Procesos.Layouts.EMP_Procesos.Upgrade.asociarEventosGovernance(SPSite sitio) en EMP_Procesos.Layouts.EMP_Procesos.Upgrade.b__2()

Source: Microsoft.SharePoint

Target site: Void PushDownChanges(CodeToPushDownChangesToDerivedCT, CodeToPushDownChangesToListCTs, Boolean, System.Collections.Generic.IList`1[System.Exception])



El análisis del problema

Investigando con SharePoint Manager, se observa que hay tipos de contenido en los sitios hijos que tienen un ensamblado erróneo y no tienen los manejadores de eventos. Se observa que la rama de EventReceivers no se puede abrir:



Debería verse así (sitios en que se encuentra bien)



La solución:

Se busca eliminar los manejadores de eventos dentro del XML utilizando este código proporcionado en una respuesta de Stackoverflow:

http://sharepoint.stackexchange.com/a/47408/39542 (se recomienda ver el hilo completo ya que existen varias soluciones que dependen de cada escenario)

var ctG = listaG.ContentTypes["Governance"];
if (ctG.XmlDocuments.Count > 0)
{
  ctG.XmlDocuments.Delete("http://schemas.microsoft.com/sharepoint/events");
  contenido.InnerHtml += "<span>" + oWebsite.Title + ": XML Documents encontrados en Governance</span><br>";
  ctG.Update();
}

El arreglo

Los tipos de contenido se visualizan así en SharePoint Manager luego de la "limpieza"




El resultado

Luego de borrar y volver a asociar los eventos, se observa el XML con el ensamblado correcto y los eventos correctos asociados:


0 comentarios:

Publicar un comentario en la entrada