2012-10-03 34 views
1

我正在使用Windows服务执行Sitecore项目(不活动或旧产品)上的清理作业,以及当我试图删除它们时,我不能。无法从Windows服务回收站点核心CMS项目

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

Relevat堆栈跟踪是:

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,用户是admin,所以他有一些权利。

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

为了绕过安全检查,我在SecurityDisabler内使用但没有结果包围回收呼叫。

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

或者还有另一种方式来从非web应用程序回收/删除Sitecore项目?

这里是运行并抛出一个拒绝访问异常(它没有一个SecurityDisabler上下文中运行)的代码:

Recycle item directly, not inside a security disabler. 这里是一个循环利用方面SecurityDisabler内部项目的代码。现在不存在拒绝异常,但是“对象引用未设置为实例”异常。在此抛出异常的方法(Sitecore.Tasks.ItemEventHandler.OnItemDeleted)的反射

Recycle item inside a SecurityDisabler context

+0

您可以尝试Web服务。您可以在/ sitecore/shell/WebService下找到它 – Lloyd

回答

4

来看,这样看来,你的空引用是有可能的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配置中。

+0

在配置文件中有一个TaskDatabase: 参数:

+0

我也使用Reflector查找执行的代码,但找不到哪个变量为null。 –

+0

您是否尝试过使用Reflector Pro进行调试? –

0

我有一个非常类似的问题,使用Sitecore的API的一个独立的服务。

我用的是BucketManager到同步的项目桶,结束了调用相同item.Delete()方法回收电话,所以我的堆栈跟踪导致我在同一地点。

TaskDatabase在我用的是web.config定义,但我决定全局的Load()方法是从来没有得到所谓的,所以我从来没有初始化任务数据库领域与配置任何东西。

在对象的构造函数调用我删除的,我包括行:

Sitecore.Globals.Load(); 

这解决了我的问题。