Не удается повторно использовать элемент Sitecore CMS из службы Windows

Я использую службу Windows, которая выполняет задания по очистке элементов Sitecore (неактивных или старых продуктов), и когда я пытаюсь их удалить, я не могу.

if (qItem != null)
{
 qItem.Recycle();
}

Соответствующий StackTrace:

Message: Object reference not set to an instance of an object.
StackTrace:   at Sitecore.Tasks.ItemEventHandler.OnItemDeleted(Object sender, EventArgs args)
   at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result)
   at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters)
   at Sitecore.Events.Event.RaiseEvent(String eventName, Object[] parameters)
   at Sitecore.Events.Event.RaiseItemDeleted(Object sender, ItemDeletedEventArgs args)
   at Sitecore.Events.Event.DataEngine_ItemDeleted(Object sender, ExecutedEventArgs`1 e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Sitecore.Data.Engines.EngineCommand`2.RaiseExecuted()
   at Sitecore.Data.Engines.DataEngine.RaiseDeletedItem(Item item, ID parentId, Boolean result)
   at Sitecore.Data.Archiving.Archive.NotifyItemDeleted(Item item, ID parentId)
   at Sitecore.Data.Archiving.SqlArchive.DoArchiveItems(IEnumerable`1 items, Guid archivalId)
   at Sitecore.Data.Archiving.SqlArchive.DoArchiveItems(IEnumerable`1 items, Guid archivalId)
   at Sitecore.Data.Archiving.SqlArchive.ArchiveItem(Item item)
   at Sitecore.Data.Items.Item.Recycle()

Я еще раз упоминаю, что эта ошибка возникает только в том случае, если я перерабатываю элемент из службы Windows. Тот же рецикл работает нормально из веб-приложения.

В веб-приложении я вхожу в sitecore, а пользователь является администратором, поэтому у него есть некоторые права.

В службе Windows пользователь (Sitecore.Context.User) — "default\Anonymous".

Чтобы обойти проверки безопасности, я окружил вызов Recycle внутри SecurityDisabler, но безрезультатно.

Нужно ли мне входить в Sitecore из службы Windows? Если да, то как я могу это сделать?

Или есть другой способ переработать/удалить элемент Sitecore из не-веб-приложения?

Вот код, который запускается и генерирует исключение отказа в доступе (он не запускается внутри контекста SecurityDisabler):

Перерабатывать элемент напрямую, а не в блокировщике безопасности.Вот код, который перерабатывает элемент в контексте SecurityDisabler. Теперь нет исключения «Отказано в доступе», но есть исключение «Ссылка на объект не указывает на экземпляр».

Перерабатывать элемент внутри контекста SecurityDisabler


person Vasile Tomoiaga    schedule 03.10.2012    source источник
comment
Вы можете попробовать веб-сервис. Вы можете найти его в /sitecore/shell/WebService.   -  person Lloyd    schedule 03.10.2012


Ответы (3)


Глядя в Reflector на метод (Sitecore.Tasks.ItemEventHandler.OnItemDeleted), который генерирует исключение, может показаться, что ваша нулевая ссылка, скорее всего, является TaskDatabase.

protected void OnItemDeleted(object sender, EventArgs args)
{
    Item item = Event.ExtractParameter(args, 0) as Item;
    Error.AssertNotNull(item, "No item in parameters");
    using (new SecurityDisabler())
    {
        Globals.TaskDatabase.RemoveItemTasks(item);
    }
}

Я предполагаю, что для вашей службы Windows у вас есть App.config с урезанной конфигурацией Sitecore. Вы должны убедиться, что элемент /sitecore/configuration/TaskDatabase находится в вашей конфигурации Sitecore.

person nickwesselman    schedule 03.10.2012
comment
В конфигурационном файле есть TaskDatabase: ‹TaskDatabase type=Sitecore.Data.$(database).$(database)TaskDatabase, Sitecore.Kernel› ‹param connectionStringName=core/› ‹/TaskDatabase› - person Vasile Tomoiaga; 04.10.2012
comment
Я также искал исполняемый код с помощью Reflector, но не мог понять, какая переменная имеет значение null. - person Vasile Tomoiaga; 04.10.2012

Когда мы устанавливаем экземпляр Sitecore, нам предоставляется веб-служба, доступная в том же домене, что и приложение Sitecore.

http://sitedomain.com/sitecore/shell/webservice/service.asmx

В этом сервисе есть все методы, необходимые для работы с Sitecore API.

Это сработало для меня

person PPP    schedule 08.02.2013

У меня была очень похожая проблема с отдельной службой, использующей API Sitecore.

Я использовал BucketManager для синхронизации корзины элементов, что закончилось вызовом того же метода item.Delete(), который вызывает Recycle, поэтому моя трассировка стека привела меня к тому же месту.

TaskDatabase была определена в web.config, который я использовал, но я решил, что метод Load() для Globals никогда не вызывался, поэтому я никогда не инициализировал поле базы данных задач чем-либо из Config.

В конструктор объекта, из которого я вызывал удаление, я включил строку:

Sitecore.Globals.Load();

Это решило мою проблему.

person Dan Cozine    schedule 03.10.2014