【问题标题】:Publish Transaction Information Type Mismatch Error发布交易信息类型不匹配错误
【发布时间】:2012-05-16 23:17:51
【问题描述】:

使用 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);
}

在上面,交易 ID 和项目类型打印正常。我还有其他代码,其中 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 World 论坛,但找不到答案。我是否缺少修补程序,我应该联系支持人员,还是有其他方法可以获取交易信息?

【问题讨论】:

  • 同样的代码在 2011 年运行良好(刚刚测试过)。不幸的是,无法在 2009 年进行测试...
  • 如果使用 Console.WriteLine("transaction info=" + pubTrans.Information.ToString()); 会得到什么;
  • 它以同样的方式爆炸。我还没有机会把它扔到远程调试器中。有一些 AD 跨域信任问题需要绕过。
  • 我的事件系统代码 sn-p 对您不起作用?我看到@SivaCharan 的答案变成了一个非常相似的解决方案。我想知道你是否已经解决了。

标签: tridion tridion2009


【解决方案1】:

我不太确定(没有在深夜的这个时候进一步挖掘),但“信息”属性实际上是 XMLElement 而不是文档所说的字符串?当您使用调试器时,您是否可以在此属性上放置一个监视以查看它包含的内容?

【讨论】:

  • 所以我在调试器中尝试了这个。它应该是 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); 

【讨论】:

  • 加载发布事务的代码显然可以作为 ID 和 ItemType 访问,所以我非常怀疑这是解决方案
  • 能够读取 ID 和 ItemType 仅证明 TOM 能够将您输入的值返回给您。可以想象,这可以正常工作,但是当需要“逐层向下”(获取信息)时,需要正确格式化的 TCM Uri。此外 - 使用 XML API 是一种很好的方法,即使在对象模型出现问题时也能正常工作。
  • 感谢您发现问题代码中缺少的“tcm”前缀。这实际上只是一个粘贴错字。我已经在我的问题中解决了它。
【解决方案3】:

我没有工作环境,所以我只是在研究我现有的任何可用代码。这是事件系统中的 sn-p,它仅在您具有管理员权限时才删除队列项目:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2016-03-01
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多