Как я могу получить ссылку на объект Specifc spweb в пользовательском задании таймера?
-
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 В этой коллекции сайта.