viernes, 17 de septiembre de 2010

Error en el elemento Web luego de varias actualizaciones en SharePoint

Pueda que este erro le suceda.

Síntoma:

Ha estado actualizando varias soluciones de elementos web y de repente  una de ellas muestra un error en el elemento Web  dentro de la página.  Lo intenta eliminar y agregar de la página y aún mas extraño le indica que no esta registrado como SafeControl. Y esta utilizando WSPBuilder y no le reporta ningún error en la interface de usuario o en Visual Studio.

 

Solución:

Si revisa los ULS de SharePoint encontrará el siguiente error que le dará una pista correcta:

Solution Deployment : Error occurred for solution infoware.portal.minuta.wsp - Error: el archivo web.config no es válido en este sitio Web de IIS: C:\Inetpub\wwwroot\wss\VirtualDirectories\8572\web.config.

Y por cada aplicación Web le muestra el mismo error.  Si revisa el Web.Config de las aplicaciones mencionadas se dará cuenta que no son legibles, y es porque se han dañado los web.config.  Si revisa el Web.Config de donde si lo estaba actualizando posiblemente encontrará que efectivamente no esta registrado el elemento Web como SafeControl y eso es porque la hacer el deployment se interrumpió y no pudo finalizar con éxito la actualización.

SharePoint guarda copias automáticamente que este archivo de configuración y lo hace por fechas como se muestra abajo en la imagen:

image

Ordénelos por fecha y restaure el mas reciente que sea legible y no muestre mas error.

Luego actualice de nuevo la solución y con ello deberá seguir trabajando como lo estaba haciendo.

Espero le sirva de ayuda, Fix4Fun!,

Manolo Herrera

lunes, 6 de septiembre de 2010

Creando dos características de distinto alcance en una sola solución en SharePoint

Dentro de una misma solución podemos crear varias características con distinto alcance y una dependiente de la otra.  En este ejemplo demostraré cómo podemos crear una característica a nivel de Colección de Sitios y una a nivel de Sitio la cual estará relacionada o dependiente de la otra.

Además podremos observar algunas tareas que pueden automatizarse al momento de activar cada una de ellas.

Para la construcción de la solución utilizo WSPBuilder que es un producto que podemos instalar de forma gratuita y que ha probado ser la mejor solución de 3eros para crear soluciones en SharePoint 2007 y que se acopla muy bien a Visual Studio (2008 en mi caso). 

No detallaré como crear una solución con WSPBuilder, he escrito otros artículos y hay suficiente documentación en la red sobre esto.  Quiero ir al punto importante sobre este ejemplo que es cómo crear estas características y relacionarlas.

Lo que si debo de mencionar es el breve procedimiento para iniciar:

1) Cree una solución en blanco.

2) Luego cree un proyecto WSPBuilder como muestra la imagen de abajo:

image

3) Cree un Elemento Web con Característica con la plantilla de WSPBuilder:

image

Luego le mostrará una ventana de dialogo: donde lo importante será definir el Scope o Alcance.  Para los elementos Web deberá seleccionar Site (Site Collection) ya que la galería esta a nivel de la colección de sitios y allí es donde almacena.

image

Esto creará las bases para iniciar mas fácilmente la creación de la solución.

Esto creará 3 archivos:

image

el archivo feature.xml; tiene la definición de la característica

elements; asocia el elemento web con la característica.

.webpart; la definición del elemento web a nivel de artefacto de SharePoint.

Si observa tiene la estructura donde depositará estos archivos, al momento de su instalación.  12 representa la siguiente ruta: %progam files%\common files\microsoft shared\web server extensions\12.

Además nos crea un directorio WebPartCode y un archivo donde esta el código del elemento Web

image

Ahora lo que vamos hacer es crear una estructura de directorios bajo el directorio Feature para separar cada feature con el alcance deseado  de tal forma que queda de la siguiente forma:

image

Cómo lo hice solo cree un nuevo directorio con el sufijo Web copie el archivo feature y renombre el otro agregando el sufijo Site para visualmente distinguir el alcance de cada uno.  Pero no se engañe el que indica esto a SharePoint es la definición xml que se encuentra dentro del archivo feature.xml que vamos a modificar.

Antes de modificar la declaración xml del feature o característica abajo en la imagen de la declaración original:

image

La nueva declaración del featue para el directorio MenuReportesAdministradosSite sería de la siguiente forma:

image

Lo importante a mencionar son los atributos ReceiverAssembly y ReceiverClass donde el Assembly es el full Qualified Name de DLL del proyecto.  Utilice Reflector para ver el Full Qualified Name.  Y ReceiverClass es el nombre de la clase donde colocaremos el código de instalación al activar la feature como muestro abajo:

image

image

Ahora veamos el archivo feature.xml del directorio que representa el alcance Web Site..

image

El valor del atributo ReceiverAssembly se mantiene igual ya que es del mismo proyecto y por tanto tiene el mismo DLL, pero el de la clase hace referencia a otra clase donde nos permitirá escribir códigos al activar el feature a nivel de cada sitio o sub-sitio.

image

* El detalle del código mostrado en la imagen de arriba esta fuera del alcance de este articulo.

Entonces tendremos dos archivos de código uno por cada nivel de alcance (Site & Web).

image

En resumen vimos en este artículo como crear dos características dentro de una misma solución y como asociar código a cada feature, útil para entregar soluciones autoinstalables que creen toda la tubería necesaria para utilizar las features activadas.

Hasta la próxima, Feature4Fun!,

Manolo Herrera