从分支插入后,服务器错误“对象引用未设置为对象的实例”

时间:2014-11-11 07:14:13

标签: sitecore sitecore7.2

一切正常但Sitecore从7.0更新到7.2后我从分支机构创建网站时看到以下服务器错误

[NullReferenceException: Object reference not set to an instance of an object.]
   Sitecore.Nexus.Data.DataCommands.AddFromTemplateCommand.(Item , Item , String , ID , ID , String , SafeDictionary`2 ) +420
   Sitecore.Nexus.Data.DataCommands.AddFromTemplateCommand.(Item , Item , String , ID , ID , String , SafeDictionary`2 ) +856
   Sitecore.Nexus.Data.DataCommands.AddFromTemplateCommand.(String , Item , Item , ID ) +569
   Sitecore.Data.Engines.DataCommands.AddFromTemplateCommand.DoExecute() +113
   Sitecore.Data.Engines.EngineCommand`2.Execute() +121
   Sitecore.Data.Engines.DataEngine.AddFromTemplate(String itemName, ID templateId, Item destination, ID newId) +101
   Sitecore.Data.Managers.ItemProvider.AddFromTemplate(String itemName, ID templateId, Item destination, ID newId) +363
   Sitecore.Data.Managers.ItemManager.AddFromTemplate(String itemName, ID templateId, Item destination, ID newItemId) +203
   Sitecore.Data.Managers.ItemManager.AddFromTemplate(String itemName, ID templateId, Item destination) +286
   Sitecore.Data.Items.Item.Add(String name, BranchId branchId) +110
   Sitecore.Workflows.WorkflowContext.AddItem(String name, BranchItem branch, Item parent) +279
   Sitecore.Shell.Framework.Commands.AddMaster.Add(ClientPipelineArgs args) +803

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +76
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +211
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +35
   Sitecore.Nexus.Pipelines.NexusPipelineApi.Resume(PipelineArgs args, Pipeline pipeline) +398
   Sitecore.Web.UI.Sheer.ClientPage.ResumePipeline() +285
   Sitecore.Web.UI.Sheer.ClientPage.OnPreRender(EventArgs e) +547
   Sitecore.Shell.Applications.ContentManager.ContentEditorPage.OnPreRender(EventArgs e) +25
   System.Web.UI.Control.PreRenderRecursiveInternal() +113
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4297

网站正确创建,我发现没有任何问题。

据我所知,项目中出现错误:addmaster command:

<command name="item:addmaster" type="Sitecore.Shell.Framework.Commands.AddMaster,Sitecore.Kernel" />

我试图反编译Sitecore.Nexus库但没有任何成功。经过几个小时的调查后,我发现如果关闭自定义事件处理程序,错误就会消失

<event name="item:created">
   <handler type="App.Client.Tasks.ItemEventHandler, App.Client" method="OnItemCreated" />
</event>

处理程序负责在从分支创建的新站点中自动映射配置设置。从技术上讲,分支模板中有一个名为Mapper的项目,它可以作为触发器。它是分支树中的最后一项。因此,当管理员从分支添加站点时,事件处理程序会检查是否已创建Mapper(换句话说,是否创建了站点),运行自动映射功能并删除触发器。

如果省略所有检查,处理程序看起来像

new ItemMappingManager(contextItem, Database.GetDatabase("master").Items[ID.Parse(MappingConfigurationItemId)]).Execute();

// delete the trigger item once the branch has been created and mapping is done
using (new SecurityDisabler())
{
    contextItem.Delete();
}

在Sitecore的活动模型中看起来有些变化,但我在这里缺乏知识。

1 个答案:

答案 0 :(得分:0)

尝试打包对Sitecore.Data.Engines.DataEngine.AddFromTemplate的任何来电或您正在进行的任何通话EventDisabler。因为Nexus中引发了异常,所以很难说出问题的确切原因是什么。

当我遇到类似的问题时,我有一个理论认为可能有一些事件正在触发并导致异常。错误并不总是发生,并且很难找到错误的原因,因为它在Nexus中被抛出。我尽可能地进行调查和调试(反混淆,反编译,读取并调试到Nexus),我发现有几个API调用会引发事件(例如AddVersion,{{1}等等)。在我将代码包装在AddMaster之后,当异常消失时,我认为我的理论得到了证实。

我的类似经历

我刚刚遇到了与Sitecore 8.1.2几乎相同的问题。我的代码和OP中的代码之间的区别在于我通过我添加到EventDisabler管道的处理器来利用新的(我相信比OP更新)ItemProvider。

以下是我添加的处理器。我使用这个处理器来运行规则,并且我收到了完全相同的错误,直到我将调用包裹在AddFromTemplate中(必须在Sitecore.Data.Engines.DataEngine.AddFromTemplate中调用,否则项目永远不会被创建)。

修复前的处理器

EventDisabler

处理器已修复

        public override void Process([NotNull] AddFromTemplateArgs args)
        {
            ID id; 

            if (args.Aborted 
                || string.IsNullOrWhiteSpace(RuleFolderId) 
                || !Settings.Rules.ItemEventHandlers.RulesSupported(args.Destination.Database)
                || !ID.TryParse(RuleFolderId, out id))
            {
                return;
            }

            Assert.HasAccess(args.Destination.Access.CanCreate(), "You do not have permission to create items here.");

            // exception thrown from this call, which is a required call for this  
            //   processor, or else the item will not actually be created
            var item = args.Destination.Database.Engines.DataEngine.AddFromTemplate(
                args.ItemName,
                args.TemplateId,
                args.Destination,
                args.NewId);

            args.ProcessorItem = item;
            args.Result = item;

            var ruleContext = new PipelineArgsRuleContext<AddFromTemplateArgs>(args);

            RuleManager.RunRules(ruleContext, id);
        }

其他观察

错误仅在大约33%的时间内出现,并且仅在以编程方式从分支模板添加项目时(从UI添加时从未发生过)。错误的确切位置似乎每次都会改变,我无法找到这种随机化的来源。