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

Luis Mañez
Apr 21, 2017 · 3 min read
Image for post
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!

Inherits Cloud

Office Development MVP.

Luis Mañez

Written by

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

Inherits Cloud

Office Development MVP. Loving Microsoft cloud, specially Office 365. Here you can find articles about Microsoft Cloud, always from a development point of view, and specially focus on SharePoint Online.

Luis Mañez

Written by

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

Inherits Cloud

Office Development MVP. Loving Microsoft cloud, specially Office 365. Here you can find articles about Microsoft Cloud, always from a development point of view, and specially focus on SharePoint Online.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store