Как я могу получить ссылку на объект Specifc spweb в пользовательском задании таймера?

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

  •  16-10-2019
  •  | 
  •  

Вопрос

У меня есть пользовательская задача таймера, которая импортирует данные из внешнего источника в конкретный список в определенной сети в моей установке SharePoint 2010. Это работа имеет отношение только к одному списку в одном Интернете.

У меня есть дьявол, когда я получаю ссылку на эту сеть (и, следовательно, список) внутри моего SPJobDefinition учебный класс.

Я мог бы жестко кодировать путь сайта и получить его с помощью новой команды SPSite ("какой -то Url"), но я бы предпочел получить ее из контекста работы, чтобы она была беспрепятственно работать в моей среде разработчика, тестирования и производства Анкет

Я попытался пропустить гид сайта в SPEventreceiver Это планирует работу, но всякий раз, когда мой SPJobDefinition Объект создан, он, кажется, использует конструктор без параметров, а не тот, который я использовал в SPEventReciever.FeatureActivated обработчик

Итак, мой вопрос в следующем:
Как я могу получить ссылку на объект SPWEB (или альтернативно объект SPSite) из SPJobDefinition.Execute() метод?

Это было полезно?

Решение

Я полагаю, что вы создали работу таймера веб -приложений. Если нет, вы можете сделать это. Видеть ссылка (Шаг 2, пуля № 7)

И затем, как описано на шаге 2, пункт 10 в ссылке выше, вы можете написать код, как это:

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"];     
}

ОБНОВЛЕНИЕ: В дополнение к этому, в вашем мероприятии FeatureActivativative, вы можете проверить, имеет ли коллекция сайтов (или сайт), в которой эта функция активирует список, на который будет действовать задание таймера. Если да, то создайте только экземпляр задания по таймеру веб -приложений.

Другие советы

Имейте конструктор на своей работе, который принимает SPWEB или String URL -адрес, а затем храните веб -URL и список URL и любые другие свойства, которые вы хотите в качестве сохраняемого имущества на работе.

Я рекомендую создать функцию веб-соревнований для установки задания таймера и создать ее с помощью имени, на котором есть веб-идентификатор (ради уникальности, если вы хотите, чтобы работа была в нескольких веб-сайтах). У этого события Activated событие будет иметь Интернет и все его свойства, которые смогут перейти в конструктор задания.

Смотрите мой сообщение в блоге для получения дополнительной информации об этом:http://spmonkeypoint.wordpress.com/2011/11/14/custom-sharepoint-2010-timer-job

Вот список кодов из этого поста:

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);
            }
        }
    }
}

Вы можете создать страницу для настройки настройки на веб -приложение, а затем использовать настройки веб -приложения для управления используемым SPWEB.

Для этого вы развернете страницу приложения в SharePoint. Вы бы сделали это доступным в центральном администраторе (вероятно, используя управление WebPplicationsElector, чтобы выбрать, какое веб -приложение для установки значения).

(Причина, по которой вы сделаете это в центральном администраторе, заключается в том, что обновление свойств веб -приложения требует доступа к записи в базу данных конфигурации - и вы можете иметь это только в центральном администраторе, в зависимости от вашей конфигурации)

Затем в «Сохранить» для вас, новое, для того, чтобы у вас было бы что -то вроде:

protected WebApplicationSelector _selector = ...

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

Затем в задании таймера вы сможете получить доступ к свойствам веб -приложения и прочитать необходимое значение.

В вашем коде TimerJob вы можете перевернуть все коллекции сайтов в веб -приложении для контекста и проверить наличие пользовательского элемента сумки свойства на rootweb (вам нужно добавить это самостоятельно), который содержит (относительный) URL -адрес SpWeb В этой коллекции сайта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top