SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




SPListitem.RoleAssignments.Add dauert zu lange

Unbeantwortet Dieser Beitrag hat 14 Antworten

Ohne Rang
163 Beiträge
Markus Sallmutter erstellt 8 Aug. 2012 15:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Community!

Ich habe derzeit das Problem das mein EventReceiver nicht schnell genug läuft.

Hauptursache dafür ist vermutlich das ich sehr viele berechtigungen setzen muss. Derzeit sind es bei meinem Test ca. 250 roleassignments und das dauert leider ca. 20s

Das Problem daran ist nicht schwer zu erkennen. Hier noch ein Code-Ausschnitt:

foreach (SPListItem userItem in userItems)
            {
                List<SPUser> userValCol = SPHelper.GetUserCollectionFromListField(userItem, fieldname);
                foreach (SPUser u in userValCol)
                {
                    ra = new SPRoleAssignment(u.LoginName, """""");
                    ra.RoleDefinitionBindings.Add(web.RoleDefinitions.GetByType(type));
 
                    foreach (SPListItem permItem in permissionItems)
                    {
                        permItem.RoleAssignments.Add(ra);
                    }
                }
            }
Hätte jemand eine Idee wie ich das ganze beschleunigen kann?
Würde es gerne unter 5 sekunden bringen. Danke schonmal für die Hilfe!

Mfg

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Aug. 2012 15:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du hast ja drei geschachtelte Schleifen. Bist Du sicher, daß dabei nur 250 Mal Berechtigungen gesetzt werden? Ansonsten muß man das wohl so schlucken. Sehr viele Einzelberechtigungen machen SharePoint eben nicht wirklich schneller.

Eine Kleinigkeit würde ich noch testen: Du greifst in der innersten Schleife auf web.RoleDefinitions zu. Lege mal außerhalb aller Schleifen eine Variable SPRoleDefinitionCollection an und verwende die in der Schleife.

Ich weiß nicht, wie es sich hier verhält, aber beim SharePoint Objektmodell verursacht man damit oft DB-Abfragen. Das beste Beispiel dafür ist SPList.Items, das bei jedem Zugriff alle Elemente aus der Datenbank lädt.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 8 Aug. 2012 15:56
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nun ich brauche die schleifen da ich jeden User in allen UserItems für jedes PermissionItem berechtigen muss...

Das mit der Collection ist ein guter ansatz hatte ich übersehn, hat die sache allerdings auch nicht wirklich merkbar beschleunigt

Trotzdem danke für die Hilfe und falls jemand noch eine Idee hat würd ich mich sehr freuen

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Aug. 2012 16:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Sallmutter"]ich brauche die schleifen da ich jeden User in allen UserItems für jedes PermissionItem berechtigen muss[/quote]

Ich hatte ja nicht bezweifelt, daß Du sie brauchst. Nur angemerkt, daß dadurch evtl. mehr Berechtigungen gesetzt werden, als man auf den ersten Blick denkt.

Sorry, aber eine Idee habe ich sonst nicht...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 8 Aug. 2012 16:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Achso naja ich hab ein Logging in einer Datenbank und hatte kurzzeitig zum testen eben auch diese Anzahl mit geloggt also sollte der Wert inetwa hinkommen, zumindest von der Größenordnung. ICh habe jedoch das Problem das es ja mit jedem neuen Item mehr berechtigungen werden, weil immer neue User und Permission Items dazukommen... ICh bin mir noch nicht sicher wie ich das dann lösen könnte für den Produktiveinsatz, denn wir haben sehr viele user

[quote user="Andi Fandrich"]aber eine Idee habe ich sonst nicht...[/quote]

Ich auch nicht^^ aber vielleicht ja ein anderes Mitglied der Community

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Aug. 2012 17:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Sallmutter"]wir haben sehr viele user[/quote]

Du mußt auch noch aufpassen, daß Du das Limit nicht überschreitest. In der Zentraladministration kann pro Webanwendung eingestellt werden, wieviele Einzelberechtigungen in einer Liste vergeben werden dürfen. Der Standardwert ist 50.000

Performanceeinbußen machen sich aber oft schon vorher bemerkbar.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 8 Aug. 2012 18:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Probiere mal

RoleAssignments.AddToCurrentScopeOnly

damit werden nur die Berechtigung für das Elemente gesetzt und nicht nach oben die Berechtigungstufe "Beschränkter Zugriff " für jeden Benutzer gesetzt.

Was ich dir noch empfehlen kann ist die Berechtigung irgendwann wieder über

ResetRoleInheritance

 zurückzusetzen oder das Element zu löschen. Meistens hat man ja nur eigene Berechtigung während ein Element / Dokument sich in Bearbeitung befindet

Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 9 Aug. 2012 08:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Antworten!

Habe jetzt AddToCurrentScopeOnly eingebaut. Es scheint eine Spur schneller zu sein aba leider reicht das noch lange nicht

Die Berechtigungsvererbung wieder einzuschalten ist bei meinem Fall nicht möglich da es sich um eine Projekt verwaltung handelt, bei der jeder nur die Projekte, Gebiete und Aufgaben sehen soll bei denen er beteiligt ist. Dafür verwende ich die Berechtigungen und je nach dem was der User in dem Projekt für eine Position hat wird die richtige Berechtigung vergeben.

ICh habe noch eine andere Frage. Was genau passiert wenn der gleiche EventReceiver 2 mal ausgelöst wird während er gerade läuft?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Aug. 2012 10:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Sallmutter"]Was genau passiert wenn der gleiche EventReceiver 2 mal ausgelöst wird während er gerade läuft?[/quote]

Der EventReceiver befindet sich ja in einer eigenen klasse. Wenn der Code z.B. durch ein ListItem.Update() dasselbe Ereignis nochmal auslöst, wird einfach eine neue Instanz der Klasse erzeugt und der Code nochmal ausgeführt. Man kann damit wunderbare Zirkelbezüge, also Endlosschleifen erzeugen ;-)

Du kannst das aber durch this.EventFiringEnabled = false verhindern. Danach aber unbedingt wieder auf true setzen!

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 9 Aug. 2012 11:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Sallmutter"]

Die Berechtigungsvererbung wieder einzuschalten ist bei meinem Fall nicht möglich da es sich um eine Projekt verwaltung handelt, bei der jeder nur die Projekte, Gebiete und Aufgaben sehen soll bei denen er beteiligt ist. Dafür verwende ich die Berechtigungen und je nach dem was der User in dem Projekt für eine Position hat wird die richtige Berechtigung vergeben.

[/quote]

Arbeite lieber mit untergeordneten Projekt Sites auf oberster ebene deiner Sitecollection (root web) kannst du als zentralen Ort der Übersicht nutzen. Über sitedataquery kannst du von den webs in deiner SiteCollection z.b alle Aufgaben aller Projekte zu einem Benutzer anzeigen.

Bei den Berechtigungen hat dann jedes Projekt seine eigenen.

Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 9 Aug. 2012 13:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Antworten!

@Andi

Ich meinte nicht das ich im Programm den Eventreceiver auslöse, damit kenne ich mich aus.
Ich frage mich was passiert wenn der Receiver 20 sekunden braucht und innerhalb dieser zeit der user den gleichen Receiver auf einem anderen Item startet, auf dem der erste Receiver gerade berechtigungen setzt.

[quote user="Thomas Östreich"]

Arbeite lieber mit untergeordneten Projekt Sites auf oberster ebene deiner Sitecollection (root web) kannst du als zentralen Ort der Übersicht nutzen. Über sitedataquery kannst du von den webs in deiner SiteCollection z.b alle Aufgaben aller Projekte zu einem Benutzer anzeigen.

Bei den Berechtigungen hat dann jedes Projekt seine eigenen.

[/quote]

Gute Idee danke. Leider wurde mir das Konzept vorgegeben und daran ist wohl nicht zu rütteln...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Aug. 2012 14:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Sallmutter"]Ich frage mich was passiert wenn der Receiver 20 sekunden braucht und innerhalb dieser zeit der user den gleichen Receiver auf einem anderen Item startet, auf dem der erste Receiver gerade berechtigungen setzt[/quote]

Wenn das bei diesem Konzept passieren kann, dann kommt es zu einem Konflikt, also zu einer Exception. Das mußt Du also entweder selbst kompliziert abfangen (alle zu ändernden Elemente in einer Queue zwischenspeichern und die dann in einem eigenen Thread abarbeiten). Ich würde allerdings ganz stark für ein anderes Konzept plädieren.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 9 Aug. 2012 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für die Antwort

Das sind allerdings keine guten neuigkeiten...

Das Konzept sollte möglichst so bleiben wie es ist allerdings sind Konflikte natürlich nicht gut.

Ich werde wohl abklären müssen ob wir konflikte tolerieren oder ein anderes Konzept wählen.

Welches würdest du denn Empfehlen?

Kurze beschreibung der Aufgabe:
3 Listen über eine Config(file oder liste) wird bestimmt wie die User die in den Items eingetragen werden auf den 3 Listen und Items in den Listen zu berechtigen sind.
Es ist so eine art selbst gebautes relationales Modell. Ein Item in der obersten Liste hat x unteritems wovon jedes wieder x unteritems hat. und jeder der in einem dieser Items drinsteht soll in allen anderen richtig berechtigt werden also lesend oder schreibend je nach position.

Hoffe das war verständlich^^

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 9 Aug. 2012 14:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du könntest an jede dieser Listen die entsprechenden EventReceiver hängen und dann jeweils die notwendigen Berechtigungen nur für dieses eine Element ändern. Das jeweils übergeordnete Element kannst Du Dir ja holen, um dessen Werte auszulesen.

Falls allerdings Änderungen am übergeordneten Element, Berechtigungsänderungen an mehreren verknüpften Elementen notwendig machen, muß man entweder den oben angesprochenen Synchronisierungsmechanismus bauen oder das Konzept radikal überdenken, z.B. mit dem von Thomas angesprochenen Konzept einzelner Websites, das ich für am Besten geeignet halte.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
163 Beiträge
Markus Sallmutter Als Antwort am 9 Aug. 2012 15:08
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für euere Antworten und Hilfe!

Ich werde das Konzept nochmal mit dem Projektleiter besprechen und die Idee von Thomas bringen.

Ich vermute allerdings das es damit enden wird, dass ich den Synchronisationsmechanismus bauen werde..

Wie der funktionieren soll ist mir zwar noch nicht ganz klar aber ich werde schon dahinter kommen ;)

Im Notfall kann ich mich ja nochmal bei euch melden, scheint als wüsstet ihr wie man das macht

Mfg
Markus