TFS Event Subscriber (TFS事件预订管理) 无为而为

 

TFS Event Subscriber 预订管理

注意:代码是针对Beta3 Refresh测试的。

微软TFS提供Event Subscriber,简单说就是TFS任何操作都可以触发一事件,这些事件包含CheckInWorkItemChangeBuildComplete等等。
    微软现在提供两种预订,一种是通过邮件的方式传递,一种是通过WebService。邮件方式设置简单,无需编码,只要简单设置即可,但是不够灵活,WebService需要编码,但是可以任意操作,非常灵活,如果你有LCS即时通讯服务器,你可以调用LCS API来发送即时消息给你的项目组员。
    这里主要描述WebService方式:
    这种方式包含两部分的内容:一个预订管理(Subscriber),一个是WebService接受端。
    微软的WebService方式目前的版本是没有界面可以操作的,所以要自己调用API来实现,(API还是比较简单的,不要看了API就怕)。


运行的Subscriber:

Subscriber
的主要代码如下:

public static int SubscribeEvent(string tfsServer, string userID, string eventType, string filterExpression, string deliveryAddress, string deliveryType, string deliverySchedule)

        


            TeamFoundationServer tfs 
= TeamFoundationServerFactory.GetServer(tfsServer);

            IEventService eventService 
= tfs.GetService(typeof(IEventService)) as IEventService;

            DeliveryPreference delivery 
= new DeliveryPreference();

            delivery.Type 
= deliveryType == "EmailHtml" ? DeliveryType.EmailHtml :

                deliveryType 
== "EmailPlaintext" ? DeliveryType.EmailPlaintext :

                deliveryType 
== "Soap" ? DeliveryType.Soap : DeliveryType.Soap ;

 

            delivery.Schedule 
= deliverySchedule == "Daily" ? DeliverySchedule.Daily

                : deliverySchedule 
== "Immediate" ? DeliverySchedule.Immediate

                : deliverySchedule 
== "Weekly" ? DeliverySchedule.Weekly 

                : DeliverySchedule.Immediate;

 

            delivery.Address 
= deliveryAddress;

            
int id = eventService.SubscribeEvent(userID, eventType, filterExpression, delivery);

            
if (id < 0)

                
throw new ApplicationException("Unable to subscribe");

            
return id;

        }


 


           WebService的主要代码如下:

 

[SoapDocumentMethod("http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/02/Notify",

  RequestNamespace 
= "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/02")]

    [WebMethod]

    
public void Notify(string eventXml, string tfsIdentityXml)

    
{

 

        
string stylesheet = Server.MapPath("WorkItemChangedEvent.xsl");

        
try

        
{

            XmlDocument xdoc 
= new XmlDocument();

            xdoc.LoadXml(eventXml);

            
//xdoc.Save("c:\\test.xml"); //test

 

            XslCompiledTransform xsldoc 
= new XslCompiledTransform();

            xsldoc.Load(stylesheet);

 

            XPathNavigator nav 
= xdoc.CreateNavigator();

            nav.MoveToRoot();

 

            StringWriter writer 
= new StringWriter();

 

            xsldoc.Transform(nav, 
null, writer);

 

            
//System.Diagnostics.EventLog.WriteEntry("TFS", eventhtml); //log

 

            
string account = @"domain\test";

            
string password = "test";

            
string uri = "sip:test@domain.local";

            
string strMsgHeader = null;

 

            
string strDestURI = "cleo@domain.local";

            
string strMsg = writer.ToString();

 

            CMS.LCSLib.RTCClass.SendMessage(account, password, uri, strMsgHeader, strMsg, strDestURI); 
//

        }


        
catch (Exception ex)

        
{

 

            System.Diagnostics.EventLog.WriteEntry(
"TFS", stylesheet + ex.ToString());

        }


}


 

测试:任意修改TFS任意项目的WorkItem,就可以接受的信息:

原文地址:https://www.cnblogs.com/cleo/p/TFSEventSubscriber.html