TFS 2013事件处理工作项目更改 [英] TFS 2013 event handling on work item change

查看:119
本文介绍了TFS 2013事件处理工作项目更改的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的TFS服务器版本是2013,而且我想要开发一个在TFS团队集合中创建或更改工作项目的软件。我计划在2015年之前升级。



我尝试了以下文章,但在2013年无效...



你推荐什么?

解决方案

找到答案!



这是我的代码:

 使用Microsoft.TeamFoundation.Common; 
使用Microsoft.TeamFoundation.Framework.Server;
使用Microsoft.TeamFoundation.WorkItemTracking.Server;
使用系统;
使用System.Collections.Generic;
使用System.Diagnostics;
使用System.Linq;
使用System.Text;
使用System.Threading.Tasks;

命名空间TFSClaritySyncEventHandler
{
public class WorkItemChangedEventHandler:ISubscriber
{

public string Name
{
get {returnWorkItemChangedEventHandler;
}

public SubscriberPriority优先级
{
get {return SubscriberPriority.Normal; }


public EventNotificationStatus ProcessEvent(
TeamFoundationRequestContext requestContext,
NotificationType notificationType,
object notificationEventArgs,
out int statusCode,
out string statusMessage,
out ExceptionPropertyCollection属性)
{
statusCode = 0;
properties = null;
statusMessage = String.Empty;
try
{
if(notificationType == NotificationType.Notification&& notifyEventArgs是WorkItemChangedEvent)
{
var ev = notificationEventArgs as WorkItemChangedEvent;
StringBuilder sb = new StringBuilder();
if(ev.ChangeType == ChangeTypes.Change)
{
sb.AppendFormat(WorkItem {0} was changed!\\\
,ev.Title);
}
else
{
sb.AppendFormat(WorkItem {0}已创建!\\\
,ev.Title);
}

if(ev.ChangedFields!= null)
{
foreach(ev.ChangedFields.IntegerFields中的var item)
{
sb.AppendFormat({0} = {1} => {2} \\\
,item.Name,item.OldValue,item.NewValue);
}
foreach(ev.ChangedFields.StringFields中的var项目)
{
sb.AppendFormat({0} = {1} => {2} \\\
,item.Name,item.OldValue,item.NewValue);
}
}

sb.Append(\\\
All fields:\ *********** \\\
);
foreach(ev.CoreFields.IntegerFields中的var item)
{
sb.AppendFormat({0} = {1} \\\
,item.Name,item.NewValue);
}
foreach(ev.CoreFields.StringFields中的var item)
{
sb.AppendFormat({0} = {1} \\\
,item.Name, item.NewValue);
}

EventLog.WriteEntry(Tfs Services,sb.ToString(),EventLogEntryType.Information);
}
}
catch(异常异常)
{
TeamFoundationApplicationCore.LogException(错误处理事件,异常);
}
返回EventNotificationStatus.ActionPermitted;
}


public Type [] SubscribedTypes()
{
return new Type [] {typeof(WorkItemChangedEvent)};
}
}
}

日志:



工作项目创建日志

  WorkItem已创建! 
区域ID = -2147483648 => 2
迭代ID = -2147483648 => 3
Priority = -2147483648 => 2
ID = -2147483648 => 28
Rev = -2147483648 => 1
PersonID = -2147483648 => 11
水印= -2147483648 => 54
工作项目类型= =>任务
区域路径= => \TestTeamProject
Node Name = => TestTeamProject
Team Project = => TestTeamProject
区域级别1 = => TestTeamProject
迭代路径= => \TestTeamProject\Sprint 1
迭代级别1 = => TestTeamProject
迭代等级2 = => Sprint 1
创建者= |%00000000-0000-0000-0000-000000000000 | => | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
已更改= |%00000000-0000-0000-0000-000000000000 | => | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
更改日期= => 11/30/2015 7:29:41 PM
Title = =>任务1.2.2
State = =>要做
Reason = =>新任务
状态更改日期= => 11/30/2015 7:29:41 PM
创建日期= => 11/30/2015 7:29:41 PM
修改日期= => 1/1/9999 2:00:00 AM
授权日期= => 11/30/2015 7:29:41 PM

所有字段:
***********
ID = 28
Rev = 1
区域ID = 2
水印= 54
迭代ID = 3
附加文件计数= 0
超链接计数= 0
外部链接计数= 0
相关链接计数= 0
工作项类型=任务
标题=任务1.2.2
区域路径= \TestTeamProject
状态=待做
原因=新任务
分配到= |%00000000-0000-0000-0000-000000000000 |
更改者= | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
更改日期= 11/30/2015 7:29:41 PM
创建者= | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
创建日期= 11/30/2015 7:29:41 PM
授权As = | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
迭代路径= \TestTeamProject\Sprint 1
授权日期= 11/30/2015 7:29:41 PM
修订日期= 1/1/9999 2:00:00 AM

工作项更改日志

  WorkItem已更改! 
Rev = 2 => 3
水印= 19 => 55
更改日期= 8/12/2015 11:49:41 PM => 11/30/2015 7:35:46 PM
State = To Do =>正在进行
Reason = New task =>工作开始
剩余工作= => 10
Activity = =>开发
状态更改日期= 8/12/2015 11:48:54 PM => 11/30/2015 7:35:46 PM
授权日期= 8/12/2015 11:49:41 PM => 11/30/2015 7:35:46 PM

所有字段:
***********
ID = 12
Rev = 3
区域ID = 2
水印= 55
迭代ID = 4
附加文件计数= 0
超链接计数= 0
外部链接计数= 0
相关链接计数= 1
工作项类型=任务
标题=任务2.2.1
区域路径= \TestTeamProject
状态=正在进行
原因=工作开始
分配给= |妞妞%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
更改者= | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
更改日期= 11/30/2015 7:35:46 PM
创建者= | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
创建日期= 8/12/2015 11:48:54 PM
授权As = | guybe%b412f809-e7b9-4c99-93c4-810d4dc5bb8d |
迭代路径= \TestTeamProject\Sprint 2
授权日期= 11/30/2015 7:35:46 PM
修订日期= 1/1/9999 2:00:00 AM


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 planning to upgrade soon to 2015.

I tried the following article but it doesn't work on 2013...

What do you recommend?

解决方案

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

这篇关于TFS 2013事件处理工作项目更改的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆