0

我为 TFS 2012 创建了一个自定义事件处理程序,每次“工作项”更改时都会触发一个事件。我遵循了各种示例,发现以下代码可在 TFS 2012 上运行:

public class WorkItemChangedEventHandler : ISubscriber
   {
        public Type[] SubscribedTypes()
          {
             return new[] { typeof(WorkItemChangedEvent) };
          }
          public EventNotificationStatus ProcessEvent(TeamFoundationRequestContext requestContext, NotificationType notificationType, object notificationEventArgs,
                                                      out int statusCode, out string statusMessage, out ExceptionPropertyCollection properties)
          {
             statusCode = 0;
             properties = null;
             statusMessage = String.Empty;
             try
             {
                if( notificationType == NotificationType.Notification && notificationEventArgs is WorkItemChangedEvent )
                {
                   var ev = notificationEventArgs as WorkItemChangedEvent;
                   EventLog.WriteEntry("WorkItemChangedEventHandler", "WorkItem " + ev.WorkItemTitle + " was modified");
                }
             }
             catch( Exception exception )
             {
                //must eat all exceptions or TFS will not load the plugin
             }
             return EventNotificationStatus.ActionPermitted;
          }
          public string Name
          {
             get { return "WorkItemChangedEventHandler"; }
          }
          public SubscriberPriority Priority
          {
             get { return SubscriberPriority.Normal; }
          }
       }

因此,虽然此代码在 TFS 的 /plugins 目录中作为 .dll 安装时运行良好,但我仍然不知道如何从外部代码中获取事件的结果。

我想通过 TFS 服务器 API 可以使用某种订阅,它允许我使用自定义事件处理程序(订阅者)订阅在 TFS 上下文下运行的事件,但我已经尝试了一周没有运气,所以现在我'我向 SO 社区求饶。

我有一个服务,它连接到我们的帮助台 API 并读取错误票,然后我将其转换为序列化的本地列表结构,以便稍后在我想检查是否有任何更改时读取。然后我使用 TFS API 更新相应的工作项,以便一切都同步。

这部分应用程序一切正常,但问题是我还需要(由我们开发人员)对 TFS 所做的更改反映到帮助台错误跟踪器。因此,我认为使用 WorkItemChanged() 事件来执行此操作可以省去我在另一边所做的手动编码。

我需要知道工作项上的哪些字段已更改以使用新值更新 BugTracker。

有没有人知道如何实现这一目标? 问题实际上归结为: 如何从控制台或服务应用程序订阅由上述编写代码触发的事件?

帮助表示赞赏。

克里斯

4

1 回答 1

1

您听起来好像不是在寻找服务器端事件,而是在寻找 SOAP 事件,其中 TFS 将调用 URL 并发送包含所需数据的 SOAP 信封。

您可以创建一个 Web 服务并让 TFS 在发生特定类型的事件时调用它:

但是,如果您无法从 TFS 服务器连接到控制台应用程序(通常发生在本地应用程序在您的计算机上而不是在服务器上运行),您可以创建自己的使用双工服务的消息队列。

为此,您将在上面的事件处理程序代码中“托管”您自己的 Web 服务端点,并让您的客户端连接到该端点。我可以看到您可能会遇到许多与此相关的问题,但是如果您不想进行投票并且即使在本地盒子上也无法让 TFS 发射肥皂,那么您将别无选择。

于 2013-01-26T21:44:26.460 回答