2012-04-13 4 views
1

Ich möchte einen Timer erstellen, der auf dem Ereignisempfänger FeatureActivated aktiviert ist. Ich möchte diesen Timer verwenden, um einmal pro Tag einige Elemente in einer Liste zu überprüfen und den Status für die Elemente zu aktualisieren.Zugriff auf das SPSite-Objekt über einen separaten Thread in Sharepoint 2010 Sandbox

Ich kann den Timer erstellen und aktivieren - kein Problem. Aber wenn ich versuche, das SPSite-Objekt zuzugreifen, die Listenelemente bekomme ich folgende Fehlermeldung erhalten:

The sharepoint subset OM has been disabled for the current thread.

Der Timer in es ausgeführt ist separaten Thread, die das Problem verursacht.

Meine Frage ist: Wie greife ich auf das SPSite-Objekt, um Zugriff auf die Listenelemente aus einem separaten Thread zu erhalten?

Hinweis: Ich verwende einen Timer, da ich keine Timer-Jobs in einer Sandbox-Lösung verwenden kann. Vielen Dank.

+0

Was meinst du mit dem * Timer *? Eine Instanz einer Klasse wie [Threading.Timer] (http://msdn.microsoft.com/en-us/library/system.threading.timer (v = vs.80) .aspx) oder [Timers.Timer] (http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.80).aspx)? –

+0

Welchen Code verwenden Sie, um das SPSite-Objekt zu erhalten, und wie lautet Ihre URL für die Websitesammlung? –

+0

Ja eine Instanz der Klasse Timer.Timer. Ich schaffe das SPSite-Objekt wie folgt aus: 'mit (SPSite Sitecollection = new SPSite ("http: // localhost: 1548")) { web = siteCollection.OpenWeb(); SPListItemCollection listItems = myWeb.Lists ["Konfiguration"]. Elemente; } ' –

Antwort

1

Ich habe Angst, dass Ihr Ansatz, eine Aufgabe im Hintergrund auszuführen, nicht möglich ist. Ich kann bestätigen, dass Sie nicht auf den SP OM in einem asynchronen Delegaten zugreifen oder auf einem getrennten Thread ausführen können. Ich schätze, das liegt daran, dass die Ressourcennutzung in Sandbox-Lösungen überwacht und gedrosselt wird. Zum Beispiel dürfen Sie Objekte nicht verlassen, ohne sie zu entsorgen.

Nicht nur Sie sind nicht berechtigt, ein SPSite Objekt mit entweder string oder Guid zu erstellen; Sie können das Objekt (SPSite)properties.Feature.Parent, das im Ereignisempfänger verfügbar ist, auch nicht an den Delegaten übergeben. (Alle Eigenschaften des Objekts werden die gleiche Ausnahme auslösen.)

Generell denke ich, dass Ihre Lösung zu zerbrechlich wäre. In einer herkömmlichen Lösung würde Ihr Code im Prozess w3wp.exe ausgeführt werden und der erste Anwendungspool-Recycling nach dem Aktivieren Ihrer Funktion würde den Timer (mit der gesamten Anwendungsdomäne) beenden. In ähnlicher Weise wären Sie in einer Sandbox-Lösung der Gnade von SPUCWorkerProcess.exe ausgeliefert. Sie benötigen einen Service-Host, der Ihren Code jeden Tag zuverlässig ausführt.

Sandboxed-Lösungen und/oder SharePoint Online bieten keine Funktionalität für im Hintergrund laufende Dienste. Sie müßten Ihren Code woanders, beispielsweise auszuführen:

  1. Wenn Sie berechtigt sind, zumindest eine kleine Farmlösung bereitstellen können Sie den Listeneintrag zu aktualisieren Code als SP-Timer Job bereitstellen.

  2. Wenn Sie sich leisten können, einen Windows-Rechner läuft die ganze Zeit können Sie das Listenelement Auffrischen Code mit dem SP-Client OM schreiben und entweder als Windows Service (timer loop) oder als Windows Scheduled Task (timed start) installieren. (Letzteres ist einfacher.)

  3. Wenn Ihre Lösung in SharePoint Online ausgeführt werden soll und Sie sich nicht auf eine lokale Windows-Maschine verlassen können, können Sie sie als hosted service (Worker Role) in Microsoft Azure bereitstellen.

  4. Sie können die regelmäßige Aktualisierungsfunktionalität implementieren, die bei Bedarf in der Sandkastenlösung ausgeführt wird, z. B. als ASPX-Seite. Dann würden Sie die URL der Ressource, die den Code ausführt, durch öffentliche Dienste wie pingler oder webcron auslösen.

Eigentlich ist die Optionen von 1 bis 3 können die gleiche Art und Weise wie die 4 Option geschrieben werden - der Code regelmäßig innerhalb der Sandbox-Lösung auszuführen und der Auslösecode (sehr kurz und SP-unabhängig) separat die gemäß Scheduler Natur - es kann sogar ein Perl-Skript mit LWP von Cron geplant werden.

--- Ferda

+0

Vielen Dank für Ihre Antwort. Die Lösung, die ich entwickle, muss als Sandbox-Lösung erstellt werden und muss auf Sharepoint Online laufen, und ich kann nach der Installation nicht auf die Daten zugreifen. –

Verwandte Themen