1.Tacking服务所要记录的状态是可以通过自定义
Tacking Pofile进行筛选的
.
2.默认Tacking服务对 [实例的各类状态]、[Activity的各类状态]、[用户跟踪行为]的所有状态进行记录,可以自定义自定义Tacking Pofile让Tacking服务只记录实际需要的状态.以下各类状态变化可被Tacking服务记录,也可用Tacking Pofile进行筛选:
实例的各类状态
|
Aborted、 Changed、 Completed、 Created、 Exception、 Idle、 Loaded、 Persisted、 Resumed、 Started、 Suspended、 Terminated、 Unloaded
|
Activity的各类状态
|
一个工作流是由多个Activity组成的,每一个Activity都会有一个生命周期,在此期间,Activity会经历多种状态:Canceling、 Closed、 Compensating、 Executing、 Faulting、 Initialized
|
用户跟踪行为
|
可以在Activity代码中用TrackData方法向Tacking服务提交自定义状态点
|
3.自定义Tacking Pofile将生成一个XML串,存入TrackingProfile表的TrackingProfileXml字段中
4.默认的Tacking Pofile以一个XML串的形式存于DefaultTrackingProfile表的TrackingProfileXml字段中
5.自定义Tacking Pofile只对指定的工作流有效,默认的Tacking Pofile对所有没有自定义Tacking Pofile的工作流有效。
6.如果所有工作流要使用同样的筛选,可以直接修改默认的Tacking Pofile,
7.如果同一对象已添加自定义的Tacking Pofile,使用默认方式再添加时,将出产生异常,该异常由UpdateTrackingProfile存储过程产生.
8.完全可以手工操作Pofile的XML串,也可以手工操作Tacking数据,而不使用本文的方式
生成自定义Pofile对象
该方法将生成一个自定义Pofile对象,并将该对象传行成一个XML串,然后调用后面的[插入Profile的XML串到数据库]方法将其存入数据库
private static void 建立并插入Profile()

{
//生成Profile的XML字串,然后专给插入Profile方法

Version 自定义版本 = new Version("4.3.2.1");
//版本信息同时存在"TrackingProfile表Version字段"与"Profile的XML字串"中


/**////////////////////////////<TrackingProfile>////////////////////////////////////////////////////
TrackingProfile profile = new TrackingProfile();

//-----------<TrackingProfile> 节-------------
profile.Version = 自定义版本;//此处用来写XML文件中的version="3.0.0.0"
//效果如下
//<TrackingProfile xmlns="http://schemas.microsoft.com/winfx/2006/workflow/trackingprofile" version="3.0.0.0">



/**////////////////////////////<ActivityTrackPoint>////////////////////////////////////////////////////

//------------------------------------------------------------------//
// 此段生成profile文件中,筛选Activity跟踪点的设置 //
//------------------------------------------------------------------//

//---------<ActivityTrackingLocation>节---------
ActivityTrackingLocation ActivityTrackingLocation节 = new ActivityTrackingLocation(typeof(Activity));
Console.WriteLine();
Console.WriteLine("已设置要监视的ActivityExecutionStatus :");
foreach (ActivityExecutionStatus status in Enum.GetValues(typeof(ActivityExecutionStatus)))

{
Console.WriteLine(status.ToString()); //一个屏幕输出
ActivityTrackingLocation节.ExecutionStatusEvents.Add(status);
}

//----------<MatchingLocations>节---------------
ActivityTrackingLocation节.MatchDerivedTypes = true;

//----------<ActivityTrackPoint>节--------------
ActivityTrackPoint ActivityTrackPoint节 = new ActivityTrackPoint();

ActivityTrackPoint节.MatchingLocations.Add(ActivityTrackingLocation节); //节入节

profile.ActivityTrackPoints.Add(ActivityTrackPoint节); //节入节


/**////////////////////<WorkflowTrackPoint>//////////////////////////////////////////////////////////

//------------------------------------------------------------------//
// 此段生成profile文件中,筛选实例跟踪点的设置 //
//------------------------------------------------------------------//


//-----------<WorkflowTrackingLocation>节---------
WorkflowTrackingLocation WorkflowTrackingLocation节 = new WorkflowTrackingLocation();

Console.WriteLine();
Console.WriteLine("已设置要监视的WorkflowEvent :");
foreach (TrackingWorkflowEvent wEvent in Enum.GetValues(typeof(TrackingWorkflowEvent)))

{
Console.WriteLine( wEvent.ToString());//一个屏幕输出
WorkflowTrackingLocation节.Events.Add(wEvent);
}
Console.WriteLine();


//-----------<WorkflowTrackPoint>节------------------
WorkflowTrackPoint WorkflowTrackPoint节 = new WorkflowTrackPoint();

//-----------<MatchingLocation>节------------------
WorkflowTrackPoint节.MatchingLocation = WorkflowTrackingLocation节; //节入节
profile.WorkflowTrackPoints.Add(WorkflowTrackPoint节); //节入节


/**//////////////////////////<UserTrackPoint>///////////////////////////////////////////////////////

//------------------------------------------------------------------//
// 此段生成profile文件中,筛选用户跟踪点的设置 //
//------------------------------------------------------------------//

//------------<UserTrackPoint>节---------------
UserTrackPoint UserTrackPoint节 = new UserTrackPoint();


//-----------<UserTrackingLocation>节-----------
UserTrackingLocation UserTrackingLocation节;
Console.WriteLine();
Console.WriteLine("设置要监视的用户监视点:已设置");
UserTrackingLocation节 = new UserTrackingLocation(typeof(string), typeof(CodeActivity));
//-----------<MatchingLocation>节------------------
UserTrackingLocation节.MatchDerivedActivityTypes = true;

UserTrackPoint节.MatchingLocations.Add(UserTrackingLocation节);
//节入节
profile.UserTrackPoints.Add(UserTrackPoint节);


/**/////////////////////////////////////////////////////////////////////////////////////////////
// //

/**/////////////////////////////////////////////////////////////////////////////////////////////

//---------------生成XML串-----------------------------
TrackingProfileSerializer 串行化对象 = new TrackingProfileSerializer();
StringWriter StringWriter接收器 = new StringWriter(new StringBuilder(), CultureInfo.InvariantCulture);

串行化对象.Serialize(StringWriter接收器, profile);

String XML字串 = StringWriter接收器.ToString();
Console.WriteLine();
Console.WriteLine("生成完成,准备插入数据库");
Console.WriteLine();
//---------------插入数据库------------------------
插入Profile的XML串到数据库(XML字串, 自定义版本);

}

接下篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构