通过核心服务触发事件系统时访问配置


19

通过核心服务触发事件时,事件系统有点麻烦。

我们将组件保存到出版物中,我们需要在T​​ridion的同一个实例中将其复制到另一个出版物。这些组件是从使用核心服务的单独应用程序中保存的。

因此,在总结: 创建/ web应用程序中的更新组件 - >通过核心服务保存到一个出版物 - >事件系统创建/更新的第二份出版物复制。

我们订阅事件中使用:

EventSystem.Subscribe<Component, SaveEventArgs>(Copy, EventPhases.TransactionCommitted); 

我们有存储在Tridion.ContentManager.config文件的几个配置值,并使用这些类似的东西访问:

var configuration = ConfigurationManager.GetSection("custom.events") as NameValueCollection; 
return configuration["Debug"]; 

副本方法工作正常,因为手动打开界面中的组件并保存完全按照预期。配置值被正确读取,组件被复制到所有正确的内容和元数据。

当我们尝试使用核心服务在外部保存组件时,事件系统就会崩溃。我们所看到的错误如下:

Object reference not set to an instance of an object. 

StackTrace Information Details: 
    at Custom.EventsSystem.Configuration.Config.get_Debug() 
    at Custom.EventsSystem.Sync.Copy(Component component, SaveEventArgs args, EventPhases phase) 
    at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Delegate.DynamicInvokeImpl(Object[] args) 
    at Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable'1 subjects, TcmEventArgs eventArgs, EventPhases phase) 

这只有在保存通过核心服务引发的,所以我不知道是否有什么事情在于,当通过核心访问外表套上读取配置文件的方式不同的情况服务?

更好的选择是有一个单独的配置文件独立于Tridion,我们手动处理?

  0

如果您设法将组件保存到一个发布中核心服务,您不能使用核心服务将其副本创建为另一个发布,而不是使用事件系统? 08 5月. 132013-05-08 12:18:54

  0

除了Ibrar的建议之外,你不应该在事件系统中使用Core Service,而应该使用TOM.NET API。 08 5月. 132013-05-08 12:31:17

  0

我们无法再使用核心服务,而无需更改一些重要的遗留代码。在蓝图的两个地方都需要组件,但蓝图不能修改以共享项目,这是一件痛苦的事情! 08 5月. 132013-05-08 12:38:10

11

如何连接到核心服务?你是使用netTCP绑定还是使用wsHttp/basicHttp绑定?在前者的情况下,app.config文件为TcmServiceHost.exe.config,后者为%TRIDION_HOME%\ webservices中的web.config ...

+1

这工作的一种享受。我们使用wsHttp绑定,修改webservices \ web.config以包含我们的自定义部分,修复了我们的问题。干杯比约恩。 09 5月. 132013-05-09 09:01:03


13

这是是“”中投

如果你写你的代码,这样邪恶的一个很好的例子:

var configuration = (NameValueCollection)ConfigurationManager.GetSection("custom.events"); 

而是一个空引用异常的,你会得到一个GetSection返回ConfigurationSection时无效的转换异常。当然,如果配置部分不存在,您仍然应该执行空引用检查,否则当您试图解引用索引器时,它会立即抛出configuration["Debug"]

+2

+2,仅仅是因为+1对于“As”剧组可能会有多么邪恶是不够的; o) 08 5月. 132013-05-08 15:45:47

  0

@BartKoopman只要算我自己的幸运,我没有在昨天用那些“训练样本”接你。:-) 08 5月. 132013-05-08 18:14:32

  0

嗯,你是对的,让我明天改变这个例子; o),就像我刚刚提到的那样,在实际的代码中除了关于清理的部分之外,从来没有真正看上去不够好。而当然演员阵容当然是邪恶的,在这个例子中,这将是一个有效的(我的辩护; o) 09 5月. 132013-05-09 22:09:53