控制SDL Tridion 2011自定义解析器的顺序

控制SDL Tridion 2011自定义解析器的顺序,tridion,Tridion,我为SDL Tridion 2011配置了一个自定义解析器,该解析器旨在防止用户发布链接的多媒体组件时发布使用多媒体组件的页面和组件。此自定义冲突解决程序正在替换旧的事件处理程序,如下所示: private void MMCmpPublishHandler(Component source, PublishEventArgs args, EventPhases phase) { if (source.ComponentT

我为SDL Tridion 2011配置了一个自定义解析器,该解析器旨在防止用户发布链接的多媒体组件时发布使用多媒体组件的页面和组件。此自定义冲突解决程序正在替换旧的事件处理程序,如下所示:

private void MMCmpPublishHandler(Component source, PublishEventArgs args, 
                                 EventPhases phase)
{
    if (source.ComponentType == ComponentType.Multimedia)
    {
        args.PublishInstruction.ResolveInstruction.IncludeComponentLinks = false;
    }
}
在调用解析程序之前,通常会调用旧的事件处理程序。通过使用以下摘录配置Tridion.ContentManager.config文件,我已将新的冲突解决程序配置为在默认冲突解决程序启动后启动:

<add itemType="Tridion.ContentManager.ContentManagement.Component">
    <resolvers>
        <add type="Tridion.ContentManager.Publishing.Resolving.ComponentResolver" assembly="Tridion.ContentManager.Publishing, Version=6.1.0.996, Culture=neutral, PublicKeyToken=360aac4d3354074b"/>
        <add type="UrbanCherry.Net.SDLTridion.CustomResolvers.DynamicBinaryLinkResolver" assembly="UrbanCherry.Net.SDLTridion.CustomResolvers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e7729a00ff9574fb"/>
    </resolvers>
</add>

有人知道是否可以在默认解析程序之前调用自定义解析程序,如果不知道,您能否建议一种有效的方法来实现与旧事件处理程序相同的行为?

当然可以先调用您的解析程序,但是您需要它来创建已解析项的初始列表。因为这基本上是默认解析器已经做的事情,所以在我的脑海中,尝试在它前面添加您的解析器没有多大意义

因此,是的,在性能方面,只使用您的解析器并将其替换为默认解析器更有意义。但是你真的应该反编译默认的,然后用你的逻辑重写它。这会适得其反。考虑到修补程序和升级,您的解析器代码将来可能需要更改


我发现解析程序实际上非常快,以至于我忽略了删除我需要删除的几个项目对性能的影响。实际上,只需将项目添加到列表中,然后再从列表中删除其中的一些项目。

我们已经向Tridion SDL支持部门打开了一个事件请求。请在下面找到他们的答案:

研发部门已确认您发现的问题是 缺陷开始于迁移到SP1。现在无法再将自定义冲突解决程序放在默认冲突解决程序之前 该问题预计将在未来版本中处理。


谢谢你,巴特。虽然这并不能真正解释为什么我的解析器从未被调用。你知道我的解析器应该实现什么样的签名吗?如果它按解析器的顺序排在第一位的话?Mine当前有:公共void Resolve(IdentifiableObject项、ResolveInstruction指令、PublishContext上下文、ISet resolvedItems)解析程序按Tridion.ContentManager.config文件中定义的顺序调用。签名和调用解析器的顺序是相互独立的。但正如巴特所说,实际上,你应该先保留默认的解析器,然后再添加自定义的解析器。因此,如果它们可以按任何顺序放置(无论这是否是最佳实践),而我的工作解析器在放置第一个时没有被调用,我是否应该将其报告为缺陷?假设其代码是正确的(这意味着您不必假设已解决项目的列表在被称为第一个解决程序时已填写。)然后我会报告它。我自己还没有时间测试它,但据我所知,它确实可以工作。您肯定可以询问客户支持是否定义了调用解析器的顺序,如果是,它是否确实匹配文档顺序(我认为是这样的)。
Object reference not set to an instance of an object.


Component: Tridion.ContentManager.Publishing
Errorcode: 0
User: NT AUTHORITY\SYSTEM

StackTrace Information Details:
   at Tridion.ContentManager.Publishing.Resolving.ResolveEngine.ResolveItems(IEnumerable`1 items, ResolveInstruction instruction, IEnumerable`1 contexts)
   at Tridion.ContentManager.Publishing.Resolving.ResolveEngine.ResolveItem(IdentifiableObject item, ResolveInstruction instruction, PublishContext context)
   at Tridion.ContentManager.Publishing.Handling.DefaultPublishTransactionHandler.HandlePublishRequest(PublishTransaction publishTransaction)
   at Tridion.ContentManager.Publishing.Handling.DefaultPublishTransactionHandler.ProcessPublishTransaction(PublishTransaction publishTransaction)
   at Tridion.ContentManager.Publishing.Publisher.QueueMessageHandler.HandleMessage()