【问题标题】:PublishOptions failing when trying to publish media items programatically尝试以编程方式发布媒体项目时 PublishOptions 失败
【发布时间】:2013-11-13 16:13:43
【问题描述】:

我正在尝试以编程方式发布媒体项目,但我遇到了 PublishOptions 对象的问题。在运行时,当我上传媒体项目时,实例化 PublishOptions 对象的代码行会中断。我收到以下消息:

"Value cannot be null. Parameter Name: item"

堆栈跟踪是:

at Sitecore.Diagnostics.Assert.ArgumentNotNull(Object argument, String argumentName)
at Sitecore.Data.Managers.ItemProvider.ApplySecurity(Item item, SecurityCheck securityCheck)
at Sitecore.Data.Managers.ItemProvider.GetRootItem(Language language, Version version, Database database, SecurityCheck securityCheck)
at Sitecore.Data.Managers.ItemManager.GetRootItem(Language language, Version version, Database database)
at Sitecore.Nexus.Data.DataCommands.ResolvePathCommand.(String itemPath, Database database)
at Sitecore.Nexus.Data.DataCommands.ResolvePathCommand.(String itemPath, Database database)
at Sitecore.Nexus.Data.NexusDataApi.ResolvePath(String itemPath, Database database)
at Sitecore.Data.Engines.DataCommands.ResolvePathCommand.DoExecute()
at Sitecore.Data.Engines.EngineCommand`2.Execute()
at Sitecore.Data.Engines.DataEngine.ResolvePath(String itemPath)
at Sitecore.Data.Managers.ItemProvider.ResolvePath(String itemPath, Database database)
at Sitecore.Data.Managers.ItemProvider.GetItem(String itemPath, Language language, Version version, Database database, SecurityCheck 

这里是 PublishOptions 对象被实例化的代码(它被破坏的地方):

public void OnItemSaved(Object sender, EventArgs args)
    {
        var item = Event.ExtractParameter(args, 0) as Item;

        using (new SecurityDisabler())
        {
            if (item != null)
            {
                if (item.Paths.IsMediaItem)
                {
                    var source = new Database("master");
                    var target = new Database("web");


                    var options = new PublishOptions(source, target, PublishMode.SingleItem, item.Language, DateTime.Now)
                                      {
                                          RootItem = item,
                                          Deep = true,

                                      };

                    var publisher = new Publisher(options);

                    publisher.PublishAsync();
                }
            }
        }
    }

我收到此错误的原因可能是什么?

【问题讨论】:

  • 尝试使用 Factory.GetDatabase("master") 和 ("web") 而不是 new Database("master");看看你是否仍然得到它。
  • 您是否启用了工作流,如果启用,该项目是否已获批准?
  • @Shriroop 谢谢。您的评论就是我问题的答案。
  • 很高兴评论很有帮助,并已发布为答案。 :-)

标签: c# sitecore sitecore-media-library


【解决方案1】:

试试这个,看看是否可行,我猜它与数据库有关。

public void OnItemSaved(Object sender, EventArgs args)
    {
        var item = Event.ExtractParameter(args, 0) as Item;

        using (new SecurityDisabler())
        {
            if (item != null)
            {
                if (item.Paths.IsMediaItem)
                {
                    var source = Factory.GetDatabase("master");
                    var target = Factory.GetDatabase("web");

                    var options = new PublishOptions(source, target, 
                                                     PublishMode.SingleItem, item.Language, 
                                                     DateTime.Now)
                                      {
                                          RootItem = item,
                                          Deep = true,
                                      };

                    var publisher = new Publisher(options);

                    publisher.PublishAsync();
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    我认为你陷入了一个典型的错误。 item:saved 也会在您的项目发布时触发。

    我最初的猜测是,您应该将支票扩大到

    if ( item != null && item.Database.Name == "master" )
    

    防止您的代码尝试发布项目,因为发布期间在“网络”上触发了 item:saved 事件。

    【讨论】:

    • 马克,即使在检查以确保该项目来自“主”数据库后,我仍然会收到错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多