Come posso ottenere un riferimento a un oggetto SPWeb specifica in un processo timer personalizzato?

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/14815

  •  16-10-2019
  •  | 
  •  

Domanda

Ho un processo timer personalizzato che importa i dati da una fonte esterna in un elenco specifico su una specifica Web nella mia installazione SharePoint 2010. Questo è il compito è rilevante solo per una lista su un web.

Sto avendo un diavolo di un tempo ottenere un riferimento a tale Web (e quindi la lista) all'interno della mia classe SPJobDefinition.

ho potuto hardcode il percorso del sito e farlo con un nuovo comando SPSite ( "someurl"), ma preferisco farlo dal contesto del lavoro in qualche modo da funzionare senza problemi in tutta la mia dev, prova e ambienti di produzione.

Ho provato a passare il sito GUID nel SPEventreceiver che gli orari di lavoro, ma ogni volta che si crea il mio scopo SPJobDefinition sembra essere utilizzando il costruttore senza parametri, invece di quella che ho usato nel gestore SPEventReciever.FeatureActivated.

Quindi, la mia domanda è questa:
Come posso ottenere un riferimento all'oggetto SPWeb (o in alternativa un oggetto SPSite) all'interno del metodo SPJobDefinition.Execute()?

È stato utile?

Soluzione

Credo di aver creato processo timer con ambito di applicazione Web. In caso contrario, si può decidere di farlo. Vedere riferimento (Fase 2, proiettile n ° 7)

E poi come descritto al punto 2, voce di proiettile 10 nel link qui sopra, è possibile scrivere codice in questo modo:

public override void Execute(Guid targetInstanceId)
{
  // Execute the timer job logic.
  SPWebApplication webApp = this.Parent as SPWebApplication;
  SPList taskList = webApp.Sites[0].RootWeb.Lists["Tasks"];     
}

UPDATE: In aggiunta a ciò, nel vostro evento FeatureActivated, si consiglia di controllare se la raccolta siti (o del sito) in cui la funzione è in corso di attivazione ha la lista che processo timer agirà su. Se sì, allora solo creare un'istanza di un'applicazione web processo timer con ambito.

Altri suggerimenti

avere un costruttore sul vostro lavoro, che prende in uno SPWeb o stringa URL, e quindi memorizzare l'url web e la lista di URL e qualsiasi altre proprietà che si desidera come una proprietà persistente sul posto di lavoro.

Mi consiglia la creazione di una funzione di web-ambito per installare il processo timer, e creare con un nome che ha l'ID web appiccicato (per l'amor unicità nel caso in cui si desidera che il lavoro su più reti). La funzione attivata evento avrebbe il web e tutte le sue proprietà proprio lì per essere in grado di passare nel costruttore del lavoro.

Vedere mio post sul blog per ulteriori informazioni su proprio questo: http://spmonkeypoint.wordpress.com/2011/11/14/custom- sharepoint-2010-timer-job

Ecco l'esempio di codice da quel post:

using System;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace MonkeyPoints.TimerJobs
{
    [Guid("6DD003C3-2861-4F63-B974-D2653E713A74")]
    public class CustomTimerJob : SPJobDefinition
    {
        [Persisted]
        public string WebUrl;

        [Persisted]
        public string ListUrl;

        public CustomTimerJob() : base() { }

        public CustomTimerJob(SPWeb web, string listUrl) : this(JobName(web), web, listUrl) { }

        public CustomTimerJob(string jobName, SPWeb web, string listUrl)
            : base(jobName, web.Site.WebApplication, null, SPJobLockType.Job)
        {
            this.WebUrl = web.Url;
            this.ListUrl = listUrl;
        }

        protected static string JobName(SPWeb web)
        {
            return "CustomTimerJob_" + web.ID;
        }

        protected override bool HasAdditionalUpdateAccess()
        {
            return true;
        }

        public override void Execute(Guid targetInstanceId)
        {
            try
            {
                using (var site = new SPSite(WebUrl))
                using (var web = site.OpenWeb())
                {
                    // process whatever you need to on this list
                }
            }
            catch (Exception ex)
            {
                SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory(this.Name, TraceSeverity.Unexpected, EventSeverity.Error), TraceSeverity.Unexpected, ex.Message, ex.StackTrace);
            }
        }

        public static void Install(SPWeb web, string listUrl, SPSchedule schedule)
        {
            using (SPSite site = new SPSite(web.Site.ID, web.Site.SystemAccount.UserToken))
            using (SPWeb eweb = site.OpenWeb(web.ID))
            {
                site.AllowUnsafeUpdates = true;
                eweb.AllowUnsafeUpdates = true;
                Uninstall(eweb);
                var syncJob = new CustomTimerJob(eweb, listUrl);
                syncJob.Schedule = schedule;
                syncJob.Update();
            }
        }

        public static void Uninstall(SPWeb web)
        {
            var jobName = JobName(web);
            foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions)
            {
                if (job.Name == jobName)
                    job.Delete();
            }
        }

        public static void RunNow(string webUrl, string listUrl)
        {
            using (SPSite site = new SPSite(webUrl))
            using (SPWeb web = site.OpenWeb())
            {
                var job = new CustomTimerJob(web, listUrl);
                job.Execute(Guid.Empty);
            }
        }
    }
}

Si potrebbe creare una pagina per configurare un'impostazione contro l'applicazione web, e quindi utilizzare le impostazioni web app per controllare lo SPWeb utilizzato.

Per fare questo, si dovrebbe distribuire una pagina di applicazione in SharePoint. Saresti che disponibili a Central Admin (probabilmente utilizzando un controllo WebApplicationSelector di scegliere quale applicazione web per impostare il valore per).

(La ragione che ci si esegue questa operazione in amministrazione centrale è che l'aggiornamento delle proprietà dell'applicazione web richiede l'accesso in scrittura al database di configurazione - e si potrebbe avere solo questo in Admin centrale, a seconda della configurazione)

Poi nel postback 'Salva' per voi di nuovo per voi avreste qualcosa di simile:

protected WebApplicationSelector _selector = ...

public void SaveIt() {
  SPWebAppliction webApp = _selector.CurrentItem;
  webApp.Properties["MyWeb"] = "SomeValue";
  webApp.Update();
}

Poi nel processo timer si dovrebbe essere in grado di accedere alle proprietà dell'applicazione web e leggere il valore è necessario.

Nel codice timerjob si potrebbe iterare throught tutte le raccolte siti in app contesto web e verificare l'esistenza di un elemento bag proprietà personalizzata sul rootweb (sarà necessario aggiungere questo voi stessi) che detiene il (server relativa) url a uno SPWeb in tale raccolta siti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top