Solucionando problema con el PnP Partner Pack, Sub Sites y custom Extensibility Providers

Luis Mañez
Inherits Cloud
Published in
3 min readApr 21, 2017
PnP Partner Pack

Si estás familiarizado con el PnP Core, seguramente en algún momento te habrás creado un ExtensibilityProvider personalizado. Si además, estás usando el PnP Partner Pack (si no es así, te recomiendo que le eches un ojo), es posible que te hayas encontrado que tu ExtensibilityProvider personalizado no está funcionando cuando se invoca desde el PnP Partner Pack a la hora de crear un sub sitio.

Si es el caso, he publicado una Pull Request al proyecto de GitHub del PnP Partner Pack, solucionando el problema. Espero que se acepte y este disponible como parte del proyecto en la siguiente reléase. En cualquier caso, sigue leyendo y te explico porque fallaba y como se soluciona.

Como sabrás, cuando se crea un ExtensibilityProvider personalizado, se implementa la interfaz “IProvisioningExtensibilityHandler” y en el caso de Aplicar la template, implementamos el método Provision, con la siguiente definición:

Como vemos, el provider recibe el ClientContext, asi que, lo más normal es que dentro de este método, accedamos al objeto Web del contexto. L

string url = ctx.Web.EnsureProperty(w => w.Url);

Para empezar, creo que el contrato del metodo Provision, deberia pasar el objeto Web, y no el ClientContext. Al fin y al cabo, cuando se aplica una template, se hace sobre un objeto Web, por lo que tiene sentido pasar ese mismo objeto, y si es necesario, desde el objeto Web se puede acceder al ClientContext “padre”. Pero bueno, esto es otra cuestión… 😊

El problema viene cuando el PnP Partner Pack crea el sub site, y como posteriormente, llama a Aplicar la template. La secuencia es algo como:

1. Primero, se carga el ClientContext del sitio Padre. Imagina algo como /sites/sc1

2. Se carga el objeto Web de ese sitio padre (apuntando a /sites/sc1)

3. Se crea un sub web dentro de /sites/sc1. Imagina /sites/sc1/sub-site-A

4. Se aplica la template al sub web recién creado

Cuál es el problema? Pues que el ClientContext se ha quedado apuntando al sitio padre, no al sub web recién creado, por lo que cuando llega al ExtensibilityProvider, si se accede al Web del contexto, se esta accediendo al sitio padre (/sites/sc1), y no al recién creado sub web.

La solución es relativamente sencilla. Tenemos que editar el Job Handler que crea el sub sitio y aplica la template en el Partner Pack. Esto se hace en los 2 jobs: Scheduled y Continuos, pero como esta refactorizado en una dll externa, solo tenemos que tocar un sitio:

…\OfficeDevPnP.PartnerPack.SiteProvisioning\OfficeDevPnP.PartnerPack.Infrastructure\Jobs\Handlers\SubSiteProvisioningJobHandler.cs

En esa clase, justo despues de que se ha creado el sub web (línea 71):

De esta forma, estamos clonando el contexto, pero relativo al nuevo sub web que acabamos de crear. Así, ahora tanto el objeto web existente (el recién creado), como el objeto web que sale del ClientContext, son lo mismo, así que podemos usarlo en nuestro custom ExtensibilityProvider.

Lo dicho, espero que os sirva, y que se haga el merge al proyecto para la siguiente release.

Saludos!

--

--

Luis Mañez
Inherits Cloud

Office Development MVP. SharePoint and Cloud Solutions architect. MS Azure certified developer and MCPD SharePoint 2010