2012-05-16 1 views
3

Использование Tridion 2009, SP1, отсюда старый COM + TOM API. Я пытаюсь получить информацию о PublishTransaction, но получаю ошибку каждый раз, когда я вызываю свойство PublishTransaction.Information.Опубликовать информацию о транзакции Тип Ошибка несоответствия

Вот мой код:

try 
{ 
    var pubTrans = (PublishTransaction)tdse.GetObject("tcm:0-166535-66560", 
                 EnumOpenMode.OpenModeView); 
    Console.WriteLine("transaction id=" + pubTrans.ID); 
    Console.WriteLine("transaction itemtype=" + pubTrans.itemType.ToString()); 
    Console.WriteLine("transaction info=" + pubTrans.Information); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message, e.StackTrace); 
} 

выше, идентификатор транзакции и тип элементов печати штрафа. У меня есть другой код, где метод Delete работает нормально, но в любое время, когда я пытаюсь получить информацию, он взрывается.

Здесь ошибка:

<tcm:Error xmlns:tcm="http://www.tridion.com/ContentManager/5.0" ErrorCode="D" 
      Category="18" Source="Kernel" Severity="1"> 
    <tcm:Line Cause="false" MessageID="16138"> 
    <![CDATA[Unable to get Information of Unknown (tcm:0-166535-66560).]]> 
    <tcm:Token>RESID_4485</tcm:Token><tcm:Token>Information</tcm:Token> 
    <tcm:Token>RESID_4663</tcm:Token><tcm:Token>tcm:0-166535-66560</tcm:Token> 
    </tcm:Line> 
    <tcm:Line ErrorCode="D" Cause="true"><![CDATA[Type mismatch]]></tcm:Line> 
    <tcm:Details> 
    <tcm:CallStack> 
     <tcm:Location>PublishTransaction.Information</tcm:Location> 
     <tcm:Location>PublishTransaction.Information</tcm:Location> 
    </tcm:CallStack> 
    </tcm:Details> 
</tcm:Error> 

Я искал SDL Tridion Всемирный форум и не мог найти ответ. Мне не хватает исправления, следует ли мне связаться с Support, или есть другой способ получить информацию о транзакции?

+0

Этот же код отлично работает в 2011 году (только что протестировал его). Невозможно проверить в 2009 году, к сожалению ... –

+0

Что вы можете получить, если используете Console.WriteLine ("transaction info =" + pubTrans.Information.ToString()); –

+0

Он взрывается точно так же. У меня еще не было возможности выбросить его в Remote Debugger. У вас возникли некоторые проблемы с доверием к домену в AD. –

ответ

3

Я не уверен (без рывков в это время ночи), но является ли свойство «Информация» фактически XMLElement, а не строкой, как говорят документы? Когда вы используете отладчик, можете ли вы поместить часы на это свойство, чтобы увидеть, что он содержит?

+0

Итак, я попробовал это в отладчике. Предполагается, что pubTrasaction.Information предполагается возвращать строку в конце концов. Я не мог никуда уйти. Я думаю, что это должен быть билет поддержки. –

2

Я попробовал это другим способом, чтобы получить информацию PublishTransaction. Ниже приведен код: -

PublishTransaction pubTrans = (PublishTransaction)tdse.GetObject(
                "tcm:0-4294103-66560", 
                EnumOpenMode.OpenModeView, 
                null, 
                XMLReadFilter.XMLReadNull); 
XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(pubTrans.GetXML(XMLReadFilter.XMLReadAll)); 
XmlNamespaceManager nameSpace = new XmlNamespaceManager(xmlDoc.NameTable); 
nameSpace.AddNamespace("tcm", "http://www.tridion.com/ContentManager/5.0"); 
nameSpace.AddNamespace("xlink", "http://www.w3.org/1999/xlink"); 
Console.WriteLine("transaction id=" + pubTrans.ID); 
Console.WriteLine("transaction itemtype=" + pubTrans.itemType.ToString()); 
EnumPublishTransactionState transState = pubTrans.get_State(); 
if (transState == EnumPublishTransactionState.Failed) 
    Console.WriteLine("transaction info=" + 
    xmlDoc.SelectSingleNode("/tcm:PublishTransaction/tcm:Data/tcm:Information", 
    nameSpace).InnerText); 
+0

Код для загрузки транзакции публикации явно работает с идентификатором и ItemType, поэтому я очень сомневаюсь, что это решение. – Will

+0

Возможность считывания идентификатора и ItemType является только доказательством того, что TOM может вернуть вам значения вы вкладываете в себя. Можно подумать, что это может работать нормально, но когда нужно идти «вниз по слоям» (для получения информации), необходимо правильно отформатировать TCM Uri. Кроме того, использование XML API - хороший подход, который часто работает даже в случае возникновения проблемы с объектной моделью. –

+0

Благодарим за обнаружение отсутствующего префикса «tcm» в коде вопроса. На самом деле это просто опечатка. Я исправил это в своем вопросе. –

0

У меня нет рабочей среды, так что я просто смотрю на то, что существующий код, который я есть в наличии. Это фрагмент из системы Event, который удаляет элемент Queue только при наличии прав администратора:

public void OnPublicationPublishPost(Publication publication, IXMLDOMDocument2 publishResult) 
{ 
    TDSE tdse = Utilities.GetTDSEInstance(); 
    publishResult.setProperty("SelectionNamespaces", "xmlns:tcm=\"http://www.tridion.com/ContentManager/5.0\""); 
    PublishTransaction publishTransaction = Utilities.GetTridionItem<PublishTransaction>(publishResult.selectSingleNode("/*/*").attributes[2].text, null) as PublishTransaction; 
    User user = Utilities.GetTridionItem<User>(publishResult.selectSingleNode("/tcm:PublishResponse/tcm:PublisherRequest/tcm:User").attributes[0].text, null) as User; 
    TDSPrivileges isAdmin = user.privileges; 
    if (isAdmin != TDSPrivileges.TdsPrivilegeSystemAdministrator) 
    { 
     publishTransaction.Delete(); 
    } 
}