2013-11-13 2 views
3

Я пытаюсь публиковать медиа-элемент программно, но я сталкиваюсь с проблемой с объектом PublishOptions. Во время выполнения строка кода, в которой создается экземпляр объекта PublishOptions, ломается, когда я загружаю элемент мультимедиа. Я получаю следующее сообщение, говорящее:PublishOptions не работает при попытке публиковать объекты мультимедиа программно

"Value cannot be null. Parameter Name: item" 

И StackTrace является:

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(); 
       } 
      } 
     } 
    } 

Что может быть причиной, по которой я получаю эту ошибку?

+3

Попробуйте Factory.GetDatabase («master») и («web») вместо новой базы данных («master»); и посмотреть, все ли вы его получите. – Shriroop

+0

У вас есть рабочий процесс включен, и если это так, то утверждается? – jammykam

+2

@Shriroop Спасибо. Ваш комментарий был ответом на мой вопрос. – user1431072

ответ

5

Попробуйте это и посмотрите, работает ли это, я предполагаю, что это связано с базой данных.

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(); 
       } 
      } 
     } 
    } 
0

Я думаю, вы попадаете в классическую ошибку. item: saved будет также срабатывать для ваших предметов по мере их публикации.

Моя первоначальная догадка бы, что вы должны расширить свой чек, чтобы быть

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

, чтобы ваш код от попыток опубликовать элемент, как элемент: сохраненные пожары событий на «Интернет» во время публикации.

+0

Марк, я все еще получаю ошибку даже после проверки, чтобы убедиться, что элемент поступает из базы данных «master». – user1431072

Смежные вопросы