code it

Martins Tech Blog

Erstellung eines eigenen EventReceivers in SharePoint

Heute soll es mal um die Erstellung eines eigenen EventReceivers gehen. Als Grundlage für die Erstellung hab ich einen Post von Miguel Moreno zum gleichen Thema verwendet, der das prinzipielle Vorgehen sehr gut erklärt wie ich finde.

Als kleinen Anwendungsfall soll der EventReceiver beim Hinzufügen eines Items zu einer Dokumentenbibliothek einen Abriss der Eigenschaften auf die Festplatte schreiben. Bei der finalen Implementierung wären hier noch Benutzerberechtigungen zu beachten. Darauf möchte ich hier nicht näher eingehen.

1. Erstellung eines neuen Projekts in Visual Studio
Zunächst startet man Visual Studio und erstellt eine neues Projekt für eine Klassenbibliothek.

Als Name soll SharePointEventHandler dienen.

2. Referenz hinzufügen
Im nächsten Schritt wird ein Verweis auf Windows SharePoint Services hinzugefügt.

3. Klasse benennen
Der enthaltenen Klasse wird nun noch ein Name gegeben. In meinem Fall ist das ItemEventreceiver.

 

4. Eigene Logik implementieren
Es werden SharePoint-Funktionalitäten und Zugriff auf das Dateisystem benötigt. Deshalb werden using-Direktiven auf System.IO und Microsoft.SharePoint hinzugefügt. Die erstellte Klasse erbt von SPItemEventReceiver.

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using Microsoft.SharePoint;

namespace SharePointEventHandler
{
    public class ItemEventReceiver : SPItemEventReceiver
    {
    }
}

Nun wird ein StreamWriter-Objekt deklariert, das später die Datei schreiben soll.

Der EventReceiver soll auf das Ereignis ItemAdded reagieren. Aus diesem Grund wird die gleichnamige Methode überschrieben und mit der gewünschten Logik gefüllt. Die finale Klasse sieht wie folgt aus:

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using Microsoft.SharePoint;

namespace SharePointEventHandler
{
    public class ItemEventReceiver : SPItemEventReceiver
    {
        private StreamWriter SW;

        public override void ItemAdded(SPItemEventProperties properties)
        {
            base.ItemAdded(properties);

            try
            {
                SW=File.CreateText(@"C:\eventoutput.txt");

                SW.WriteLine("CurrentUserId: " + properties.CurrentUserId.ToString());
                SW.WriteLine("BeforeUrl: " + properties.BeforeUrl.ToString());
                SW.WriteLine("SiteId: " + properties.SiteId.ToString());
                SW.WriteLine("ListId: " + properties.ListId.ToString());
                SW.WriteLine("ListItem: " + properties.ListItem.ToString());
                SW.WriteLine("ListTitle: " + properties.ListTitle.ToString());
                SW.WriteLine("ReceiverData: " + properties.ReceiverData.ToString());
                SW.WriteLine("WebUrl: " + properties.ToString());

                SW.Close();
            }
            catch (Exception ex)
            {
                properties.Cancel = true;
                properties.ErrorMessage = ex.Message;
                throw ex; 
            }
            finally
            {
                this.SW.Dispose();
            } 
        }
    }
}

5. Assembly signieren und in den Global Assembly Cache installieren
Dem Assembly muss nun ein Schlüssel zugewiesen werden, damit es strong-named ist und im GAC installiert werden kann. Dazu wird zunächst ein Schlüssel ausgewählt.

Im Anschluss daran kann man das Ergebnis der Kompilierung in den GAC kopieren. Entweder man nutzt dafür den Explorer oder man fügt diesen Task in den PostBuild-Event ein.

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\GacUtil.exe" -i "$(TargetPath)"

6. Feature definieren
SharePoint-Features benötigen nicht nur die DLL, sondern müssen über Konfigurationsdateien im Ordern "12" noch bekannt gemacht werden. Die benötigte Ordnerstruktur legt man am besten gleich im Projekt an.

Hierbei ist auf die Benennung der Ordner zu achten, da der Ordnername "SharePointEventHandler" im späteren Verlauf noch zur Identifizierung des Features verwendet wird.

Unterhalb dieses Ordners sind zwei XML-Dateien anzulegen:

a) feature.xml
Diese Datei beinhaltet die Hauptkonfiguration des Features. Hier ist eine neue GUID, ein Name und eine Beschreibung zu vergeben.

<?xml version="1.0" encoding="utf-8" ?>
<Feature
   Id="4B2B6531-A043-43f8-B58F-CDC7D35C4517"
   Title="SharePointEventHandler"
   Description="This feature is a dummy event handler."  
   Scope="Web"
   Hidden="FALSE"
   AlwaysForceInstall="TRUE"
   ImageUrl="components.gif" xmlns="http://schemas.microsoft.com/sharepoint/">

    <ElementManifests>
        <ElementManifest Location="elements.xml" />
    </ElementManifests>
</Feature>

b) elements.xml
Diese Datei beinhaltet Detailinformationen zum Feature. Hier sind die Events aufgelistet, für die der EventReceiver registriert wird sowie das Assembly.

<?xml version="1.0" encoding="utf-8" ?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
    <Receivers ListTemplateId="101">
        <Receiver>
            <Name>SharePointEventHandler</Name>
            <Type>ItemAdded</Type>
            <SequenceNumber>1000</SequenceNumber>
            <Assembly>
                SharePointEventHandler,
                Version=1.0.0.0,
                Culture=Neutral,
                PublicKeyToken=1244abcbb537729f
            </Assembly>
            <Class>SharePointEventHandler.ItemEventReceiver</Class>
            <Data />
        </Receiver>
    </Receivers>
</Elements>

Die ListTemplateId 101 definiert, dass sich der EventReceiver auf Dokumentenbibliotheken bezieht. Unter Assembly ist das eben erstellte Assembly anzugeben. Der PublicKeyToken ist ersichtlich, wenn man sich die Eigenschaften des Assemblies im GAC ansieht.

7. Feature installieren und aktivieren
Die Ordnerstruktur muss nun in den 12-Ordner des SharePoints kopiert werden und im Anschluss daran mit stsadm installiert werden. Das kann einerseits über Windows-Explorer und Kommandozeile oder ebenfalls über das PostBuild-Ereignis vorgenommen werden

cd "$(ProjectDir)"
xcopy "12" "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\" /ys

cd "%CommonProgramFiles%\Microsoft Shared\web server extensions\12\BIN"
stsadm -o installfeature -name SharePointEventHandler -force

iisreset

Nachdem das Feature nun installiert ist, muss es noch aktiviert werden. Auch hier hat man wieder mehrere Möglichkeiten. Entweder über die Kommandozeile mit stsadm und dem Befehl activatefeature oder über das UI des SharePoint-Portals (Site Settings -> Site Administration -> Site Features)

8. Test des Features
Wenn man nun in der SharePoint-Site eine Dokumentenbibliothek anlegt und dieser per "New" oder "Upload" eine Datei hinzufügt, wird eine Textdatei geschrieben.

Pingbacks and trackbacks (1)+

Kommentar schreiben

Loading