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.




SharePoint 2010 TimerJob mit Visual Studio 2010

Unbeantwortet Dieser Beitrag hat 12 Antworten

Ohne Rang
55 Beiträge
tonikln erstellt 23 Aug. 2012 13:35
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich habe mittels VS2010 einen TimerJob gebaut. Dieser soll mir Daten aus einer SharePoint-Liste in eine DB schreiben. Das Problem bei dem ganzen liegt darin, dass ich die SiteCollection als Link fest implementiert habe.
 public override void Execute(Guid targetInstanceId)        
{
           using(SPSite site = new SPSite("http://vm/sitecollection/testsite"))
            {
                         ....
            }
}

Wenn ich ein WebPart implementiere kann ich ja den SPContext nutzten um den Link herauszufinden.
Beim TimerJob geht es allerdings nicht, weil der SPContext ja immer null wäre bzw. ist.
Was kann ich denn dagegen tun, damit ich mir den Link dynamisch ziehen kann ?

Gruß

Alle Antworten

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

Ein Timerjob kann so definiert werden, daß er als Parent eine WebApp hat. Damit bekommst Du dann schonmal die URL der WebApp und kannst auf jede SiteCollection dynamisch zugreifen (WebApp.Url + "/sites/site1"). Der relative Pfad ist dann aber immer noch hart codiert.

Wenn Dir das nicht ausreicht, mußt Du Dir Gedanken um einen geeigneten Speicherort für die SiteCollection-Url machen. Das kann ein Config-File oder eine externe DB sein (dann brauchst Du aber wieder einen dynamischen Connectionstring).

Ich baue mir dafür immer ein eigenes SPPersistedObject und speichere das als Kind der Farm. Damit kannst Du von jeder beliebigen Stelle darauf zugreifen. Schreiben kannst Du es aber nicht im Kontext einer normalen WebApp. Also brauchst Du dafür wieder ein Konsolenprogramm oder ein PowerShell. Der komfortabelste Weg ist aber eine eigene Seite in die Zentraladministration zu hängen und darüber die Einstellungen zu bearbeiten.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
55 Beiträge
tonikln Als Antwort am 23 Aug. 2012 14:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kannst du mir zufällig einen Link geben, wo diese Schritte mit den Config File aufgeschrieben sind.

Ich weiß nämlich nicht genua wo ich ansetzten soll.

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

Ich halte das nicht für den besten Weg, aber es gibt grundsätzlich zwei Möglichkeiten:

1. das Config-File des Timerdienstes (owstimer.exe)

2. die web.config der WebApp, an die Du so kommst:
Configuration config = WebConfigurationManager.OpenWebConfiguration("/", "WebAppName");
string value = config.AppSettings.Settings["keyName"].value;

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
55 Beiträge
tonikln Als Antwort am 31 Aug. 2012 14:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Andi Fandrich"]

 Der komfortabelste Weg ist aber eine eigene Seite in die Zentraladministration zu hängen und darüber die Einstellungen zu bearbeiten.

[/quote]

Wie würde ich den eine Seite in der Zentraladministration hängen? Hast du da zufällig einen Link wie das implementiert wird ?
Das wäre sehr hilfreich ;)

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

http://msdn.microsoft.com/en-us/library/ff798467.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
55 Beiträge
tonikln Als Antwort am 31 Aug. 2012 15:23
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Süüüüper danke ;)

Und wie ist es wenn ich das ganze über die web.config machen möchte?
Momentan habe ich es wie folgt:

web.config:
<appSettings>
    <add key="LinkForTimerJob" value="http://myServer/websites/site/" />
</appSettings>

In der Execute Methode:
string siteUrl = WebConfigurationManager.AppSettings["LinkForTimerJob"].ToString();

Ich bekomm da leider immer ein null Reference Exception. Weiß jemand woran das liegt ?

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

Das liegt an den unterschiedlichen Config-Dateien. Die SharePoint Website verwendet eine andere als die Zentraladministration und eine andere als der Timerdienst. Auf diese Art bekommst Du das also nicht hin.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
55 Beiträge
tonikln Als Antwort am 1 Sept. 2012 21:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja da hast du recht...

man müsste die owstimer.config im 14 ordner bearbeiten damit man auf die URL kommt, die man braucht.
Ich hätte an der Stelle noch eine Frage.
1. Application page:
Wenn ich eine Applicatin page erstelle (so wie in msdn gezeigt wird), wie komm ich denn eigentlich vom Timerjob code in die application page?
Wenn ich zum Beispiel eine TextBox in der Seite erstelle und der Benutzer seinen Link da eingibt, wie kann ich sicherstellen, dass die URL gespeichert bleibt ?

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Sept. 2012 08:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du mußt die Einstellungen natürlich irgendwo zwischenspeichern, wo sowohl die Application Page als auch der Timerjob drankommen. Man kann z.B. ein eigenes, von SPPersistedObject abgeleitetes Objekt schaffen und das als Child von SPFarm.Local speichern -> Google

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
55 Beiträge
tonikln Als Antwort am 3 Sept. 2012 18:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Also ich habe es jetzt wie folgt gemacht:
Ich habe eine Application Page erstellt, wo ich einen Link in der Textbox angeben kann. Zusätzlich habe ich eine Klasse settings die von SPPersisted Object erbt. In der settings klasse habe ich eine property:
[Persisted]
public string siteColUrl;

Im code behind versuche ich dann die die Url zu setzten:
SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                SPFarm farm = SPFarm.Local;
                Settings jobSettings = new Settings();
                jobSettings.siteColUrl = TextBox.Text;
                jobSettings.Update(false);
            });

Leider bekomm ich beim Updaten immer eine NullReference Exception... weiß jemand woran es liegt ?

Ohne Rang
55 Beiträge
tonikln Als Antwort am 3 Sept. 2012 21:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Stop komando zurück :) Mein fehler.. ich benutz den falschen Konstruktor... Aber nachdem ich die änderung vorgenommen habe, bekomme ich eine Exception Access Denied.
Ich habe auch schon folgende Methode hinzugefügt:

protected
override bool HasAdditionalUpdateAccess()
{
   return true;
}

Allowunsafeupdates habe ich ebenfalls eingeschaltet aber bekomme immer diese Meldung:

"Aktualisierungen von GET-Abfragen sind momentan untersagt. Legen Sie bitte die AllowUnsafeUpdates-Eigenschaft von SPWeb fest, um Aktualisierungen für GET-Abfragen zuzulassen."

Dieser Fehler kommt immer wenn ich den update durchführen möchte.

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 4 Sept. 2012 09:27
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Deine Konfigurationsseite sollte in der CA Bereitgestellt werden, da im Normalfall nur die CA und der Zeitgeber auf die Config DB schreibenden Zugrfiff haben.

[quote user="tonikln"]

Allowunsafeupdates habe ich ebenfalls eingeschaltet aber bekomme immer diese Meldung:

"Aktualisierungen von GET-Abfragen sind momentan untersagt. Legen Sie bitte die AllowUnsafeUpdates-Eigenschaft von SPWeb fest, um Aktualisierungen für GET-Abfragen zuzulassen."

Dieser Fehler kommt immer wenn ich den update durchführen möchte.

[/quote]

 Wenn du die Standardfunktionalität von ASP.Net nutzt (Postback) dann hast du ein POST.