一切正常但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的活动模型中看起来有些变化,但我在这里缺乏知识。
答案 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添加时从未发生过)。错误的确切位置似乎每次都会改变,我无法找到这种随机化的来源。