Windows services 无法从Windows服务中回收Sitecore CMS项目

Windows services 无法从Windows服务中回收Sitecore CMS项目,windows-services,sitecore,recycle,Windows Services,Sitecore,Recycle,我使用的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

我使用的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应用程序中,我登录到sitecore,用户是管理员,所以他有一些权限

在Windows服务中,用户Sitecore.Context.user为默认\匿名

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

我需要从Windows服务登录Sitecore吗?如果是,我怎么做

或者是否有其他方法可以从非web应用程序中回收/删除Sitecore项目

下面是运行并引发拒绝访问异常的代码,该异常不是在SecurityDisabler上下文中运行的:

下面是在SecurityDisabler上下文中回收项的代码。现在没有拒绝访问异常,但对象引用未设置为实例异常


在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配置中。

在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配置中。

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

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


这对我来说很有效

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

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


它对我有效

我在使用Sitecore API的独立服务方面遇到了非常类似的问题

我使用BucketManager同步一个item bucket,结果调用了相同的item.Delete方法来循环调用,所以我的堆栈跟踪将我带到了相同的位置

TaskDatabase是在我使用的web.config中定义的,但是我决定Globals上的Load方法永远不会被调用,所以我从来不会用config中的任何东西初始化TaskDatabase字段

在调用delete from的对象的构造函数中,我包括以下行:

Sitecore.Globals.Load();

这解决了我的问题。

我在使用Sitecore API的独立服务方面遇到了非常类似的问题

我使用BucketManager同步一个item bucket,结果调用了相同的item.Delete方法来循环调用,所以我的堆栈跟踪将我带到了相同的位置

TaskDatabase是在我使用的web.config中定义的,但是我决定Globals上的Load方法永远不会被调用,所以我从来不会用config中的任何东西初始化TaskDatabase字段

在调用delete from的对象的构造函数中,我包括以下行:

Sitecore.Globals.Load();

这解决了我的问题。

您可以尝试web服务。您可以在/sitecore/shell/webservices下找到它。您可以尝试web服务。您可以在/sitecore/shell/webservice下找到它。配置文件中有一个TaskDatabase:我还使用Reflector查找了已执行的代码,但无法确定哪个变量为null。配置文件中有一个TaskDatabase:我还使用Reflector查找了已执行的代码,但无法确定是什么变量为空。