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

SO、このコードは TFS の /plugins ディレクトリに .dll としてインストールされている場合は正常に動作しますが、外部コード内からイベントから結果を取得する方法はまだわかりません。

カスタム イベント ハンドラー (サブスクライバー) を使用して、TFS コンテキストで実行されているイベントをサブスクライブできる、TFS サーバー API を介して利用できる何らかのサブスクリプションがあると思いますが、1 週間試してみましたが、うまくいきませんでした。 SOコミュニティからの慈悲を懇願します。

私が持っているのは、ヘルプ デスク API に接続してバグ チケットを読み取るサービスです。次に、これをシリアル化されたローカル リスト構造に変換して、何か変更があったかどうかを確認したいときに後で読み取ります。次に、TFS API を使用して対応する作業項目を更新し、すべてが同期されるようにします。

アプリケーションのこの部分ではすべてが機能しますが、問題は、(私たち開発者が) TFS で行った変更をヘルプ デスク バグ トラッカーに反映する必要があることです。そのため、これを行うために WorkItemChanged() イベントを使用すると、反対側で行ったように手動でコーディングする必要がなくなると考えました。

BugTracker を新しい値で更新するために、作業項目のどのフィールドが変更されたかを知る必要があります。

これを達成する方法について手がかりを持っている人はいますか? 要するに 、コンソールまたはサービス アプリケーションから、上記のコードによって発生したイベントをサブスクライブするにはどうすればよいでしょうか。

助けていただければ幸いです。

クリス

4

1 に答える 1

1

サーバー側のイベントを探しているのではなく、TFS が URL を呼び出し、必要なデータを含む SOAP エンベロープを送信する SOAP イベントを探しているように聞こえます。

Web サービスを作成し、特定のタイプのイベントが発生するたびに TFS がそれを呼び出すようにするだけです。

ただし、TFS サーバーからコンソール アプリケーションに接続できない場合 (通常、サーバーではなくコンピューター上で実行されているローカル アプリで発生します)、Duplex サービスを使用する独自のメッセージ キューを作成できます。

これを行うには、上記のイベント ハンドラー コード内で独自の Web サービス エンドポイントを「ホスト」し、クライアントをそこに接続させます。これには、遭遇する可能性のある多くの問題がありますが、ポーリングしたくない場合や、ローカル ボックスでも TFS に SOAP を起動させることができない場合は、選択の余地がほとんどありません。

于 2013-01-26T21:44:26.460 に答える