c# - SDL Tridion 事件订阅取消订阅问题

标签 c# .net tridion unsubscribe

我们正在尝试取消订阅事件代码中的 eventSubscripton。我们正在使用以下代码

[TcmExtension("EventHandlerExtension")]
public class EventHandler : TcmExtension, IDisposable
{
    private EventSubscription componentSaveSubscription = null;
    private EventSubscription componentPublishSubscription = null;

    #region Public Methods
    /// <summary>
    /// Handle for Eventing System
    /// </summary>
    public EventHandler()
    {
        Subscribe();
    }
    /// <summary>
    /// Subscribe Events
    /// </summary>
    public void Subscribe()
    {
        //News Article Page created when component Save
        componentSaveSubscription = EventSystem.Subscribe<Component, SaveEventArgs>(OnComponentSavePost, EventPhases.TransactionCommitted);

        //EventSystem.Subscribe<Component, SaveEventArgs>(OnComponentSavePost, EventPhases.TransactionCommitted);
        componentPublishSubscription = EventSystem.Subscribe<Component, PublishOrUnPublishEventArgs>(OnComponentPublishOrUnPublishPost, EventPhases.TransactionCommitted);
        //EventSystem.Subscribe<StructureGroup, PublishOrUnPublishEventArgs>(OnStructureGroupPublishInitiated, EventPhases.TransactionCommitted);

    }
    /// <summary>
    /// IDisposable Implementation
    /// </summary>
    public void Dispose()
    {

        if (componentSaveSubscription != null) componentSaveSubscription.Unsubscribe();
        if (componentPublishSubscription != null) componentPublishSubscription.Unsubscribe();
    }}

我们观察到的是,一旦“{EventSubsciption}.Unsubscribe”被调用,事件将停止为它应该工作的后续事件工作。一旦事件系统相关服务重新启动,事件代码仅在第一次按预期工作,并且永远不会为后续事件(它应该工作)调用。

最佳答案

尝试删除 Dispose 方法,看看是否有所不同。 Tridion 有可能在触发事件的第一个实例时实例化事件处理程序,然后在系统重新启动之前不再执行它。因此,如果您取消订阅并处置,那么您的类将不会再次实例化。也有可能是您环境中的其他因素在干扰。很难说,但先尝试删除 Dispose。

我的样板处理程序如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;
using Tridion.ContentManager.Extensibility;
using Tridion.ContentManager.Extensibility.Events;

namespace NicksEventSystem
{
    [TcmExtension("NicksEventSystemExtension")]
    public class NicksEventHandler : TcmExtension
    {
        public NicksEventHandler()
        {
            Subscribe();
        }

        private void Subscribe()
        {
            EventSystem.Subscribe<Component, FinishActivityEventArgs>(MyEvent, EventPhases.TransactionCommitted);
        }

        private void MyEvent(Component wfComponent)
        {
            //... Do stuff!
        }

    }
}

关于c# - SDL Tridion 事件订阅取消订阅问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520442/

相关文章:

c# - 碰撞检测不统一

c# - 如何检测是否按下了任何键盘功能键?

c# - 通过强制转换在 2 个类之间传递值

c# - 基于类的GUI代码生成

c# - 即发即弃方法

C# - 将值添加到字符串数组,除非它们为 NULL

.net - 如何在Wine 64位前缀中安装.NET 4?

tridion - 有时在传输阶段发布失败,错误为 "Internal Server Error"

tridion - 我们可以使用 SiteEdit 2009 在 Tridion 中编辑 XML 文档吗?

sorting - 更改下拉列表中关键字的默认顺序