1

我正在使用 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 服务回收项目时才会收到此错误。Web 应用程序中的相同回收工作正常。

在 Web 应用程序中,我登录到 sitecore,用户是管理员,所以他有一些权限。

在 Windows 服务中,用户 (Sitecore.Context.User) 是"default\Anonymous".

为了绕过安全检查,我在 SecurityDisabler 中使用了 Recycle 调用,但没有结果。

我是否需要从我的 Windows 服务登录到 Sitecore?如果是,我该怎么做?

还是有另一种方法可以从非 Web 应用程序中回收/删除 Sitecore 项目?

下面是运行并抛出拒绝访问异常的代码(它不在 SecurityDisabler 上下文中运行):

直接回收项目,而不是在安全禁用程序内。 这是在 SecurityDisabler 上下文中回收项目的代码。现在没有拒绝访问异常,但是“对象引用未设置为实例”异常。

在 SecurityDisabler 上下文中回收项目

4

3 回答 3

4

在反射器中Sitecore.Tasks.ItemEventHandler.OnItemDeleted查看引发异常的方法 (),您的 null 引用似乎很可能是 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 服务,您有一个带有精简 Sitecore 配置的 App.config。您应该确保该/sitecore/configuration/TaskDatabase元素在您的 Sitecore 配置中。

于 2012-10-03T13:57:55.103 回答
1

当我们安装 Sitecore 实例时,我们会获得一个 Web 服务,该服务与 Sitecore 应用程序在同一域下公开

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

该服务具有使用 Sitecore API 所需的所有方法。

它对我有用

于 2013-02-08T13:09:37.107 回答
0

对于使用Sitecore APIs的独立服务,我遇到了非常相似的问题。

我正在使用BucketManager来同步一个项目存储桶,它最终调用了与item.Delete()Recycle 调用相同的方法,因此我的堆栈跟踪将我带到了相同的位置。

TaskDatabase是在我使用的文件中定义的web.config,但我决定Load()永远不会调用 Globals 上的方法,因此我从未使用 Config 中的任何内容初始化 Task Database 字段。

在我调用删除的对象的构造函数中,我包含了以下行:

Sitecore.Globals.Load();

这解决了我的问题。

于 2014-10-03T19:12:00.310 回答