TFS 2013 event handling on work item change

后端 未结 1 1708
天涯浪人
天涯浪人 2021-01-07 13:44

I would like to develop software which runs every time a work item is being created or changed in a TFS team collection.

My TFS server version is 2013 and i\'m plann

相关标签:
1条回答
  • 2021-01-07 14:13

    Found the answer!

    here's my code:

    using Microsoft.TeamFoundation.Common;
    using Microsoft.TeamFoundation.Framework.Server;
    using Microsoft.TeamFoundation.WorkItemTracking.Server;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TFSClaritySyncEventHandler
    {
        public class WorkItemChangedEventHandler : ISubscriber
        {
    
            public string Name
            {
                get { return "WorkItemChangedEventHandler"; }
            }
    
            public SubscriberPriority Priority
            {
                get { return SubscriberPriority.Normal; }
            }
    
            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;
                        StringBuilder sb = new StringBuilder();
                        if (ev.ChangeType == ChangeTypes.Change)
                        {
                            sb.AppendFormat("WorkItem {0} was changed!\n", ev.Title);
                        }
                        else
                        {
                            sb.AppendFormat("WorkItem {0} was created!\n", ev.Title);
                        }
    
                        if (ev.ChangedFields != null)
                        {
                            foreach (var item in ev.ChangedFields.IntegerFields)
                            {
                                sb.AppendFormat("{0} = {1} => {2}\n", item.Name, item.OldValue, item.NewValue);
                            }
                            foreach (var item in ev.ChangedFields.StringFields)
                            {
                                sb.AppendFormat("{0} = {1} => {2}\n", item.Name, item.OldValue, item.NewValue);
                            }
                        }
    
                        sb.Append("\nAll fields:\n***********\n");
                        foreach (var item in ev.CoreFields.IntegerFields)
                        {
                            sb.AppendFormat("{0} = {1}\n", item.Name, item.NewValue);
                        }
                        foreach (var item in ev.CoreFields.StringFields)
                        {
                            sb.AppendFormat("{0} = {1}\n", item.Name, item.NewValue);
                        }
    
                        EventLog.WriteEntry("Tfs Services", sb.ToString(), EventLogEntryType.Information);
                    }
                }
                catch (Exception exception)
                {
                    TeamFoundationApplicationCore.LogException("Error processing event", exception);
                }
                return EventNotificationStatus.ActionPermitted;
            }
    
    
            public Type[] SubscribedTypes()
            {
                return new Type[] { typeof(WorkItemChangedEvent) };
            }
        }
    }
    

    result in event log:

    work item creation log

    WorkItem  was created!
    Area ID = -2147483648 => 2
    Iteration ID = -2147483648 => 3
    Priority = -2147483648 => 2
    ID = -2147483648 => 28
    Rev = -2147483648 => 1
    PersonID = -2147483648 => 11
    Watermark = -2147483648 => 54
    Work Item Type =  => Task
    Area Path =  => \TestTeamProject
    Node Name =  => TestTeamProject
    Team Project =  => TestTeamProject
    Area Level 1 =  => TestTeamProject
    Iteration Path =  => \TestTeamProject\Sprint 1
    Iteration Level 1 =  => TestTeamProject
    Iteration Level 2 =  => Sprint 1
    Created By = |%00000000-0000-0000-0000-000000000000| => |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Changed By = |%00000000-0000-0000-0000-000000000000| => |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Changed Date =  => 11/30/2015 7:29:41 PM
    Title =  => Task 1.2.2
    State =  => To Do
    Reason =  => New task
    State Change Date =  => 11/30/2015 7:29:41 PM
    Created Date =  => 11/30/2015 7:29:41 PM
    Revised Date =  => 1/1/9999 2:00:00 AM
    Authorized Date =  => 11/30/2015 7:29:41 PM
    
    All fields:
    ***********
    ID = 28
    Rev = 1
    Area ID = 2
    Watermark = 54
    Iteration ID = 3
    Attached File Count = 0
    Hyperlink Count = 0
    External Link Count = 0
    Related Link Count = 0
    Work Item Type = Task
    Title = Task 1.2.2
    Area Path = \TestTeamProject
    State = To Do
    Reason = New task
    Assigned To = |%00000000-0000-0000-0000-000000000000|
    Changed By = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Changed Date = 11/30/2015 7:29:41 PM
    Created By = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Created Date = 11/30/2015 7:29:41 PM
    Authorized As = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Iteration Path = \TestTeamProject\Sprint 1
    Authorized Date = 11/30/2015 7:29:41 PM
    Revised Date = 1/1/9999 2:00:00 AM
    

    work item changed log

    WorkItem  was changed!
    Rev = 2 => 3
    Watermark = 19 => 55
    Changed Date = 8/12/2015 11:49:41 PM => 11/30/2015 7:35:46 PM
    State = To Do => In Progress
    Reason = New task => Work started
    Remaining Work =  => 10
    Activity =  => Development
    State Change Date = 8/12/2015 11:48:54 PM => 11/30/2015 7:35:46 PM
    Authorized Date = 8/12/2015 11:49:41 PM => 11/30/2015 7:35:46 PM
    
    All fields:
    ***********
    ID = 12
    Rev = 3
    Area ID = 2
    Watermark = 55
    Iteration ID = 4
    Attached File Count = 0
    Hyperlink Count = 0
    External Link Count = 0
    Related Link Count = 1
    Work Item Type = Task
    Title = Task 2.2.1
    Area Path = \TestTeamProject
    State = In Progress
    Reason = Work started
    Assigned To = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Changed By = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Changed Date = 11/30/2015 7:35:46 PM
    Created By = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Created Date = 8/12/2015 11:48:54 PM
    Authorized As = |guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d|
    Iteration Path = \TestTeamProject\Sprint 2
    Authorized Date = 11/30/2015 7:35:46 PM
    Revised Date = 1/1/9999 2:00:00 AM
    
    0 讨论(0)
提交回复
热议问题