none
SharePoint 2010 Events werden unterschiedlich ausgelöst RRS feed

  • Frage

  • Mein Szenario gliedert sich wie folgt:

    Auf dem Entwicklungssystem und auf dem Produktiven System ist die gleiche Lösung (wsp) eingespielt.

    In dieser Lösung wird mitunter ein EventHandler ausgebracht, welche auf ListItems reagiert (in einer Document Library) genauer gesagt dort auf den Updated Event.

    Der EventHandler modifiziert die Berechtigungen des einzelnen Listeneintrags entsprechend einer Auswahl an Metadaten dieses Listeneintrags.

    Da wir im Kontext einer Dokumentenbibliothek sind, handelt es sich bei unseren Listeneinträgen konkret um Dokumente.

    Der Arbeitsablauf auf unserer SharePoint Site gliedert sich wie folgt.

    Wir haben Dokumente in einer Bibliothek (Drafts) und speichern dort genehmigte Dokumente in die Bibliothek (Documents, dies ist die Bibliothek mit dem EventHandler).

    Nun haben wir das Verhalten, dass in der Testumgebung der Added und der Updated Event im Documents Bereich triggern. In der Produktiven Umgebung haben bisher auch beide Events getriggered, jetzt aber hat der Updated Event aufgehört zu triggern (ca. seit 4 Wochen).

    Nun stellt sich die Frage: Warum triggert das Event nicht mehr?

    Was klar ist, ist, dass der Eventhandler weiterhin funktioniert, wenn man manuell einen Update auf ein Item in der Bibliothek auslöst.

    Donnerstag, 18. Oktober 2012 12:02

Antworten

  • Hallo,

    ich hab das Problem mit der Exception teilweise nachstellen können. Ich hab eine Dokumentenbibliothek auf der ich checkin und checkout aufgedreht habe.
    Ich weiß du erstellst sie direkt aus dem SharePoint, nur ich hab leider Office 2013 auf meinem Rechner und hab das alte Office mit dem kopieren im Explorer simuliert.

    Ich hab also einen einfachen Event Receiver der vom Aufbau her gleich deinem ist:

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = new SPSite(properties.WebUrl))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            SPList list = web.Lists[properties.ListId];
                            SPListItem item = list.GetItemById(properties.ListItemId);
                        }
                    }
                });

    Das ist alles was er macht. Nach 2/3 des Kopiervorgangs wird bei mir bereits der Event Receiver gefeuert, da das File jedoch noch nicht vollständig am SharePoint ist.

    Das Problem ist nicht, dass das ListItem als solches nicht in der Liste existiert, sondern dass der Benutzer einen Exclusiven Lock auf das File gesetzt hat und somit auch die Security Delegation das Element nicht sehen kann. Das Element existiert jedoch kann nur der Benutzer selber darauf zugreifen, nicht jedoch der System.

    Was du machen kannst ist die ModerationInformation zu überprüfen und die Berechtigungen nur dann setzen, wenn die Datei eingecheckt wird.

    Da das Office zuerst das Template vom Server auf den Client lädt und dann wieder über die webdav Schnittstelle auf den SharePoint lädt, vermute ich einmal dass du in das gleiche Problem läufst.

    Wichtig dabei ist, dass du auf deiner Entwicklungsumgebung nicht als "System" arbeitest, sondern als normaler Benutzer, weil du sonst das Problem nicht nachstellen kannst. System darf auf die für ihn exklusiv gelockten Elemente zugreifen, aber wie schon gesagt nicht auf die von anderen Benutzern.

    lg
    Stefan Bauer


    http://www.n8d.at/blog
    Follow me on Twitter: StFBauer | n8design

    Microsoft Community Contributor 2011 / 2012
    MCTS - SharePoint / WSS Configuration and Development

    Dienstag, 23. Oktober 2012 09:37

Alle Antworten

  • Hallo Christian,

    was sagt das ULS Log?

    Gruß,
    Andrei

    Donnerstag, 18. Oktober 2012 17:53
  • Hallo Andrei,

    ich hab die Log Levels auf Verbose gesetzt.

    Mein Code hat kein Fehler oder keine Information ausgegeben, weil er ja nicht angesprochen wurde.

    In den restlichen Logs konnte ich keine Auffälligkeiten entdecken.

    Grüße,

    Christian

    Freitag, 19. Oktober 2012 06:34
  • Hallo,

    hast du mit dem SharePoint Manager geschaut ob die Event Receiver auf der Liste registriert sind. Den kannst du unter http://spm.codeplex.com herunterladen.

    lg
    Stefan


    http://www.n8d.at/blog
    Follow me on Twitter: StFBauer | n8design

    Microsoft Community Contributor 2011 / 2012
    MCTS - SharePoint / WSS Configuration and Development

    Freitag, 19. Oktober 2012 09:08
  • Hallo,

    der Event Receiver ist dran, das konnte ich mit dem Manager erkennen.

    Er tut auch das was er soll, wenn ich ihn nochmal anstupse (Item Edit -> Speichern -> darauf triggered der Updated Event mit dem Code der hinterlegt ist).

    Was nicht kappt, ist, wenn ich ein Item in die Bibliothek speichere, woraufhin die Events Adding, Added, Updating und Updated triggern. Wobei ich jetzt folgende Fehlermeldung noch gefunden habe:

    10.19.2012 14:10:32.25 w3wp.exe (MyServer:0x1544) 0x09D4 SharePoint Foundation General 6875 Critical Error loading and running event receiver MyAssembly.Components.SetReader in MyAssembly.Components, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d406eb96ba43640. Additional information is below.  : Item does not exist. It may have been deleted by another user. 

    Wohlgemerkt, das Item wird der Liste hinzugefügt und es passiert nirgends eine Lösch-Aktion, weder im Code noch im Interface.

    Grüße,

    Christian

    Montag, 22. Oktober 2012 06:43
  • Hallo Christian,

    Kannst du bitte den Code posten wie du auf das Item zugreifst?

    Lg Stefan


    http://www.n8d.at/blog
    Follow me on Twitter: StFBauer | n8design

    Microsoft Community Contributor 2011 / 2012
    MCTS - SharePoint / WSS Configuration and Development

    Montag, 22. Oktober 2012 10:04
  • Hallo,

    der Zugriff erfolgt über einen EventHandler, hier der Auszug der Elements Xml:

    <Receivers ListTemplateId="10101" ListTemplateOwner="73f264df-d1dd-4319-9988-2f02ee0bc035" Scope="Web"> <Receiver> <Name>SetReaderItemUpdated</Name> <Type>ItemUpdated</Type> <SequenceNumber>100</SequenceNumber> <Assembly>MyAssembly.Components, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5d406eb96ba43640</Assembly> <Class>MyAssembly.Components.SetReader</Class> <Data></Data> <Filter></Filter> <Synchronization>Asynchronous</Synchronization> </Receiver> </Receivers>

    Und hier noch der Code auszugsweise:

    public override void ItemUpdated(SPItemEventProperties properties)     {       SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("MyAssembly.SetReader"TraceSeverity.Monitorable, EventSeverity.Information), TraceSeverity.Monitorable, "Trigger ItemUpdated Event");       EventFiringEnabled = false;       try       {         SetReadersPermissions(properties);       }       finally       {         EventFiringEnabled = true;       }       SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("MyAssembly.SetReader"TraceSeverity.Monitorable, EventSeverity.Information), TraceSeverity.Monitorable, "End of updated event");     }

    Das Item wird dann so zugegriffen in der Methode SetReaderPermissions:

    SPSecurity.RunWithElevatedPrivileges(delegate()         {           using (SPSite site = new SPSite(properties.SiteId, token))           {             using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))             {               SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("MyAssembly.SetReader"TraceSeverity.Monitorable, EventSeverity.Information), TraceSeverity.Monitorable, "Entered elevated web");               web.AllowUnsafeUpdates = true;               SPList list = web.Lists[properties.ListId];               SPListItem item = list.GetItemById(properties.ListItemId);

    ...

    Am Ende wird das Item über item.SystemUpdate() aktualisiert.

    Viele Grüße,

    Christian


    Montag, 22. Oktober 2012 11:53
  • Hallo,

    ladest du die Dateien normal über das Web Interface oder über die Explorer View. Die Fehlermeldung, dass der Listeneintrag nicht gefunden wurde kann dort manchmal auftretten.

    lg
    Stefan


    http://www.n8d.at/blog
    Follow me on Twitter: StFBauer | n8design

    Microsoft Community Contributor 2011 / 2012
    MCTS - SharePoint / WSS Configuration and Development

    Montag, 22. Oktober 2012 23:07
  • Guten Morgen,

    ich lade die Dateien weder über das WebInterface im Upload, noch über die Explorer View, sondern nutze im Word/Excel usw. die Funktion speichern unter und kann dort eine SharePoint Bibliothek als Speicherort angeben.

    Viele Grüße,

    Christian

    Dienstag, 23. Oktober 2012 07:35
  • Hallo,

    ich hab das Problem mit der Exception teilweise nachstellen können. Ich hab eine Dokumentenbibliothek auf der ich checkin und checkout aufgedreht habe.
    Ich weiß du erstellst sie direkt aus dem SharePoint, nur ich hab leider Office 2013 auf meinem Rechner und hab das alte Office mit dem kopieren im Explorer simuliert.

    Ich hab also einen einfachen Event Receiver der vom Aufbau her gleich deinem ist:

                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = new SPSite(properties.WebUrl))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            SPList list = web.Lists[properties.ListId];
                            SPListItem item = list.GetItemById(properties.ListItemId);
                        }
                    }
                });

    Das ist alles was er macht. Nach 2/3 des Kopiervorgangs wird bei mir bereits der Event Receiver gefeuert, da das File jedoch noch nicht vollständig am SharePoint ist.

    Das Problem ist nicht, dass das ListItem als solches nicht in der Liste existiert, sondern dass der Benutzer einen Exclusiven Lock auf das File gesetzt hat und somit auch die Security Delegation das Element nicht sehen kann. Das Element existiert jedoch kann nur der Benutzer selber darauf zugreifen, nicht jedoch der System.

    Was du machen kannst ist die ModerationInformation zu überprüfen und die Berechtigungen nur dann setzen, wenn die Datei eingecheckt wird.

    Da das Office zuerst das Template vom Server auf den Client lädt und dann wieder über die webdav Schnittstelle auf den SharePoint lädt, vermute ich einmal dass du in das gleiche Problem läufst.

    Wichtig dabei ist, dass du auf deiner Entwicklungsumgebung nicht als "System" arbeitest, sondern als normaler Benutzer, weil du sonst das Problem nicht nachstellen kannst. System darf auf die für ihn exklusiv gelockten Elemente zugreifen, aber wie schon gesagt nicht auf die von anderen Benutzern.

    lg
    Stefan Bauer


    http://www.n8d.at/blog
    Follow me on Twitter: StFBauer | n8design

    Microsoft Community Contributor 2011 / 2012
    MCTS - SharePoint / WSS Configuration and Development

    Dienstag, 23. Oktober 2012 09:37