« - »

Cómo registrar eventos en SharePoint

Viernes, 11 de julio de 2008

Como continuación del último post en el que vimos como crear un evento paso a paso, ahora veremos diferentes maneras que tenemos para registrar nuestro evento en SharePoint.

Antes de continuar con este post, recomendamos revisar el anterior:

Cómo crear un evento en SharePoint

Tal y como comentamos, las diferentes formas que tenemos para registrar el evento, todas ellas igual de válidas, son:

  1. Creando una característica de SharePoint, que nos permitirá activarla y desactivarla desde el propio SharePoint.

  2. Con una aplicación de consola con el modelo de objetos de Sharepoint.

  3. De forma automática con una aplicación gratuita de administración de SharePoint llamada SharePoint Inspector.

1.- CREANDO UNA CARACTERÍSTICA DE SHAREPOINT

Probablemente esta manera de registrar el evento es la que más trabajo tiene inicialmente para crear la característica. Pero una vez creado la característica, nos permitirá activar y desactivarla desde la “Configuración del sitio” del Sharepoint.

Siguiendo con el desarrollo que iniciamos en nuestro anterior post, añadiremos y preparemos otro proyecto de tipo “Biblioteca de clases” para la instalación de la característica:image16image17

Eliminamos la clase “Class1.cs” que se crea automáticamente y agregamos un archivo XML que llamaremos “Feature.xml”:image19 image20

Insertar el siguiente código en el .xml:

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
  Id="[guid]"
  Scope="Web"
  Title="Announcement Event Handler"
>
    <ElementManifests>
        <ElementManifest Location="Elements.xml" />
    </ElementManifests>
</Feature>

 

En el código sustituiremos [guid] por uno nuevo. Para obtener un Guid podemos ejecutar desde la línea de comandos: C:\Archivos de programa\Microsoft Visual Studio 8\Common7\Tools\guidgen.exe o desde la opción “Crear Guid” en el menú Herramientas de Visual Studio:

image21

<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
  Id="{1FA22BF6-79FC-45fb-8F33-E1CC3B37A7F2}"
  Scope="Web"
  Title="Cancelar añadir nuevos elementos"
>
    <ElementManifests>
        <ElementManifest Location="Elements.xml" />
    </ElementManifests>
</Feature>

 

También necesitaremos obtener el Public Key Token del ensamblado con el comando C:\archivos de programa\Microsoft Visual Studio 8\SDK\v2.0\Bin\sn.exe:

sn –Tp [pathToAssembly]\[assemblyFileName]

o siguiendo los pasos que comenta Andrew Conell: http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx

Ahora creamos otro xml que llamaremos “elements.xml”:

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <Receivers ListTemplateId="100">
        <Receiver>
            <Name>listapersonalizada</Name>
            <Type>ItemAdding</Type>
            <SequenceNumber>10000</SequenceNumber>
            <Assembly>
                EventoNuevaPromo,
                Version=1.0.0.0,
                Culture=neutral,
                PublicKeyToken=eb28d2942d41f46a
            </Assembly>
            <Class>EventoNuevaPromo.AddingAction</Class>
            <Data></Data>
            <Filter></Filter>
        </Receiver>
    </Receivers>
</Elements>

En este xml tenemos varios parámetros que comentar. ListTempateId hace referencia al id de la plantilla que afectará esta característica, y en este caso, a que tipo de lista se agregará el evento. Type tiene que ser el evento que estamos agregando. Sequencenumber es el orden en que se ejecutará este evento si tenemos varios eventos asociados a una lista.

Después de esto copiamos las 2 xmls creados a

C:\Archivos de programa\Archivos comunes\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\[nombre caracteristica], en nuestra caso a C:\Archivos de programa\Archivos comunes\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\listapersonalizada.

Se puede hacer con un comando xcopy en los post-built commands para automatizar.

Luego con 2 comandos stsadm instalaremos la características y la activaremos:

Stsadm.exe –o installfeature –name listapersonalizada
Stsadm.exe –o activatefeature –name listapersonalizada –url http://localhost

En lugar del 2º comando, podríamos activar la característica desde el navegador en la “Configuración del sitio”. Finalmente sólo nos faltaría reciclar la Application Pool desde el administrador de IIS.

Para desinstalar la característica:

stsadm –o deactivatefeature –name [nombrecaracteristica] –url http://localhost

stsadmn –o uninstallfeature –name [nombrecaracteristica]

y a continuación reciclar el Application Pool.

 

2.- CON EL MODELO DE OBJETOS DE SHAREPOINT

En este caso también agregaremos un proyecto a nuestra solución del evento, pero esta vez una aplicación de consola:

image23

Agregamos la referencia de Microsoft.SharePoint como en el proyecto del Evento y agregamos el using Microsoft.SharePoint.

Introducimos en la clase el siguiente código:

try
            {
                string listName = "Documentación";
                string siteURL = "http://localhost";
                string receiverName = "Evento Archivo Nuevo";
                int sequenceNumber = 2001;
                string assemblyFullName = "EventoArchivoNuevo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c2296eb2e1f5b8e";
                string assemblyClassName = "EventoArchivoNuevo.AddedAction";
                string receiverData = "";
 
                SPList list = new SPSite(siteURL).OpenWeb().Lists[listName];
                SPEventReceiverDefinitionCollection eventReceivers = list.EventReceivers;
                //eventReceivers[0].Delete();
                SPEventReceiverDefinition eventReceiver = eventReceivers.Add();
                eventReceiver.Name = receiverName;
                eventReceiver.Type = SPEventReceiverType.ItemAdded;
                eventReceiver.SequenceNumber = sequenceNumber;
                eventReceiver.Assembly = assemblyFullName;
                eventReceiver.Class = assemblyClassName;
                eventReceiver.Data = receiverData;
                eventReceiver.Update();
                Console.WriteLine("Todo OK");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            Console.ReadLine();

La información que introducimos en nuestro código es prácticamente equivalente a la que introducimos en el  elements.xml de la característica.

Establecemos el proyecto creado como proyecto de inicio:

image25

Y ejecutamos.

Si todo ha ido bien:

image26

Sólo nos faltaría reciclar el Application Pool (o un poco más a lo bruto, hacer un iisreset).

Para desasociar el evento de la lista, podemos descomentar en el codigo la línea de eventReceivers[0].Delete(); y comentar el resto

Otro código equivalente visto en el blog de Carlos Segura sería:

using System;
using Microsoft.SharePoint;
 
namespace ConsoleTools
{
    class Program
    {
        static void Main(string[] args)
        {
            SPSite site = new SPSite("http://spsbeta/SiteDirectory/test");
            SPWeb web = site.OpenWeb();
            SPList list = web.Lists["Demo"];
 
            string ensamblado = "MiWebPart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d196fc71b3d34a48";
            string clase = "MiWebPart.MiEventHandler";
 
            list.EventReceivers.Add(SPEventReceiverType.ItemAdded, ensamblado, clase);
            list.EventReceivers.Add(SPEventReceiverType.ItemUpdated, ensamblado, clase);
            list.EventReceivers.Add(SPEventReceiverType.ItemDeleting, ensamblado, clase);
 
        }
    }
}

Como mejora podríamos editar los códigos para que nos pida la URL de la web y el nombre de la biblioteca/lista en la que queremos registrar el evento.

De esta forma, no tenemos que activar característica ni nada, pero no tenemos la versatilidad de desasociar el evento a través de la interfaz web ya que no tenemos la característica.

3.- Usando una aplicación externa: Sharepoint Inspector

Este programa es de mucha utilidad y lo podemos obtener desde Codeplex. Nos permite agregar/eliminar un evento a cualquier lista o biblioteca de SharePoint, y como veréis de la forma más fácil.

Una vez creado nuestro evento, los pasos para registrar el evento con este programa sería los siguientes.

Desplegar el menú de árbol hasta llegar a “Event Receivers” dentro de nuestra lista:

image28

y con el botón derecho, hacemos click sobre “Add event”:

image29

image

Seleccionamos la DLL en “Load DLL” y nos carga los eventos creados en esta dll.

image

Nos Rellena el assembly de forma automática. Sólo tenemos que seleccionar en clase y en la lista Event Type el evento que queremos asociar. Observad el detalle del checkbox que nos verifica que la dll está registrada en el GAC:

image

Y simplemente presionando “Add” ya tendremos registrado nuestro evento.

Casi de la mismo forma, si queremos eliminar el evento de la lista, sólo tendríamos que desplegar el evento y con el botón derecho “Remove”:image

Otro herramienta parecida a Sharepoint Inspector pero sólo orientada al manejo de eventos es EventHandlerExplorer desarrollada por U2U.

RESULTADO

Con cualquiera de las 3 formas, conseguimos lo mismo.

En nuestro ejemplo en el evento bloqueamos el adding (properties.Cancel = true;) de una lista y mostramos el siguiente mensaje de error (properties.ErrorMessage = “No se puede añadir nuevos elementos”;).

Este es el resultado al intentar insertar un elemento en nuestra lista:

image22


3 Respuestas to ' Cómo registrar eventos en SharePoint '

Suscribirse a comentarios con RSS or TrackBack to ' Cómo registrar eventos en SharePoint '.

  1. jmmartinez dice,

    el diciembre 11th, 2008 a las 18:28

    Hola quería saber, que solución se puede adoptar si el usuario que añade el evento a la lista es un usuario anónimo, ya que esto provoca un error en Sharepoint

  2. José Andreu dice,

    el diciembre 11th, 2008 a las 18:31

    Por motivos de seguridad, un usuario anónimo no puede registrar eventos en SharePoint.

  3. jmmartinez dice,

    el diciembre 15th, 2008 a las 9:47

    Hola José Andreu, ¿No hay ninguna manera de que un usuario anónimo registre eventos en una lista? Mi problema a priori parece sencillo, tengo una lista con acceso anónimo, y cada vez que alguien añada un item, tiene que mandar un correo electrónico al administrador del sito. He probado con un workflow y con una .dll (eventHandhler) y ambos dan el mismo error por falta de memoria en el servidor. He intentado impersonar el el usuario anónimo, pero sospecho que el error salta antes de que empiece el evento. ¿Alguna sugerencia?
    Gracias

Dejar una respuesta

Dark traducido por Reproduccion Asistida Inspirado en: Bloggerlounge & Arquitectura