SharePoint 2010: как получить доступ к любому списку из настраиваемого задания таймера?

Я разрабатываю задание таймера SharePoint 2010 на C #, которое обновляет информацию о статусе сотрудников (доступны ли они в настоящее время или отсутствуют на работе), полученную из базы данных SQL, для обновления и сохранения в списке сотрудников SharePoint ( желаемый подход - иметь доступ к любому выбранному мной списку, а не только к одному заданному / жестко закодированному списку). Я создал пустой проект SharePoint, единственной функцией которого является задание таймера с моим классом приемника событий с настраиваемым кодом в методах FeatureActivated и FeatureDeactived. Метод Execute класса задания таймера получает данные с помощью SqlClient и сохраняет их в объекте словаря, значением ключа которого является идентификатор сотрудника, а значением - статус. Затем словарь используется для получения записей о сотрудниках в списке сотрудников SharePoint и обновления статуса.

Моя проблема в том, что независимо от того, какую область действия я выбрал для задания таймера, я не могу получить доступ к любому списку SharePoint, который мне нужен. Я пытался жестко закодировать URL-адреса для списков, используя SPWeb и SPSite, что угодно. Я проверил коллекцию сайтов для своего сайта, и у меня есть две коллекции сайтов («/», «testsitecollection»), а вторая вообще не используется.

Например, "SPWeb web = site.OpenWeb (); SPList list = web.Lists [" Сотрудники "];

Возникает исключение: «Список« Сотрудники »не может быть найден на http://www.mysite»

Мне было интересно, есть ли у кого-нибудь мнение по этому поводу. Что касается исходного кода, я следил за множеством примеров в Интернете, например: http://www.andrewconnell.com/blog/articles/CreatingCustomSharePointTimerJobs.aspx

Все примеры, которые я нашел в Интернете для пользовательских заданий таймера, обновляют списки на главном сайте, такие как список задач.

Спасибо всем, кто добавляет свой вклад.


person J-man    schedule 12.02.2013    source источник
comment
Просто для быстрой проверки ... вы можете получить доступ к списку сотрудников с сайта / пользовательского интерфейса Sharepoint. Правильно?   -  person Lorenzo Dematté    schedule 14.02.2013
comment
Кроме того, чтобы исключить проблемы с разрешениями ... пробовали ли вы использовать SPSecurity.RunWithElevatedPrivileges?   -  person Lorenzo Dematté    schedule 14.02.2013
comment
пожалуйста, опубликуйте полный пример кода, который вы используете   -  person int32    schedule 14.02.2013
comment
Да, я могу получить доступ к списку через пользовательский интерфейс сайта, и да, я проверил разрешения, и ничего не вышло. В конце концов я обнаружил, что в моем методе Execute для задания таймера, следуя онлайн-руководствам, я использовал targetGuid из списка параметров Execute, чтобы получить соответствующую базу данных контента, а с этого и соответствующий сайт. Это было проблемой, поэтому, когда я усложнил код для получения первого индекса в списке баз данных контента и первого индекса в списке сайтов, это сработало. Однако это добавляет еще одну проблему в будущем, она больше не является динамической и исправляется кодом.   -  person J-man    schedule 18.02.2013
comment
int32: По юридическим причинам я не могу показать точный исходный код, но могу дать вам общий - публичный переопределение Execute (Guid targetInstanceId) {SPWebApplication webApp = this.Parent as SPWebApplication; SPContentDatabase contentDb = webApp.ContentDatabases [0]; SPList list = contentDb.Sites [0] .RootWeb.Lists [Сотрудники]; // оставшийся код - это получение информации из SQL и сохранение в списке}   -  person J-man    schedule 18.02.2013
comment
Я предполагаю, что настоящая проблема заключается в том, как я могу использовать targetGuid, предоставленный из метода Execute, для правильного получения базы данных контента и сайта, на котором будет находиться мой список сотрудников, потому что в настоящее время это задание таймера будет работать только в том случае, если список находится на первой странице первого сайта в семействе сайтов (что исключает любые динамические возможности, которые нужны другим разработчикам и администраторам). Каждый раз, когда я использую targetGuid, я получаю следующую ошибку, отображаемую в журнале истории заданий таймера центра администрирования. Ссылка на объект не установлена ​​на экземпляр объекта.   -  person J-man    schedule 18.02.2013


Ответы (1)


У меня такая же проблема, и я обнаружил, что она у меня сработала: вам следует перезапустить OWSTimer.exe (оконная служба в панели управления -> инструменты администрирования -> службы). Возможно, вы применяете изменение, но последний код еще не получен службой таймера Sharepoint.

person Nguyen Huynh    schedule 04.07.2013