Posted on 2008-06-29 11:20
玄铁剑 阅读(216)
评论(0) 编辑 收藏 引用 所属分类:
WF
跟踪配置文件用于筛选跟踪信息,以便仅接收关注的跟踪信息。为了实现此目的,跟踪服务使用 TrackingProfile 对象来请求跟踪信息。 当新工作流实例启动时,跟踪框架对每个向运行时注册的跟踪服务调用 TryGetProfile。 工作流实例的类型将作为参数提供给此调用。 如果跟踪服务想要接收所述实例的跟踪信息(通常由正在运行的实例的类型确定),则返回 true 并指定 TrackingProfile 对象作为 out 参数。 TrackingProfile 对象包含的信息指示运行时跟踪服务想要接收的事件和数据。 当跟踪框架接收到在跟踪配置文件中指定的事件时,它通过使用跟踪通道将事件信息发送到跟踪服务。
跟踪配置文件可以表示为 XML 文件,该文件使用 Windows Workflow Foundation 中定义的 TrackingProfile 架构。 跟踪配置文件还具有一个提取其详细信息的复杂对象模型。 可以通过使用对象模型或 XML 创建跟踪配置文件。 但是,必须将以 XML 格式表示的跟踪配置文件反序列化为 TrackingProfile 对象,因为运行时需要 TrackingProfile 对象。
警告: |
如果在跟踪配置文件中使用了非英语变量,则应使用 Unicode 编码保存跟踪配置文件。
|
跟踪配置文件对象模型元素
使用 TrackingProfile 对象可以跟踪工作实例事件、单个活动事件和自定义用户事件。 跟踪配置文件对象模型使用各种对象构建跟踪配置文件,使用该文件可以更为精细地控制跟踪服务从运行时引擎接收的信息。
跟踪点
TrackingProfile 包含三种不同类型的控制点。 可以筛选三种跟踪事件:
您可以将 WorkflowTrackPoint 对象添加到 WorkflowTrackPoints 属性以匹配特定的工作流状态事件;将 ActivityTrackPoint 对象添加到 ActivityTrackPoints 以匹配特定的活动状态事件;将 UserTrackPoint 对象添加到 UserTrackPoints 属性以匹配特定的用户事件。
WorkflowTrackPoint
当工作流实例的状态发生更改时,工作流实例将向运行时跟踪基础结构发出基于 TrackingWorkflowEvent 值之一的工作流状态事件。 WorkflowTrackPoint 定义对执行工作流实例的过程中所有发生特定类型工作流状态事件的点进行关注。 这些状态事件在 WorkflowTrackPoint 的 MatchingLocation 属性中加以定义。 有关跟踪位置与 WorkflowTrackPoint 之间的关系的信息,请参见本主题中的“跟踪位置”一节。
通过添加 Annotations,WorkflowTrackPoint 还可以指定附加的相关信息,运行时跟踪基础结构应发送这些信息。 批注是您定义的字符串,它包含与 WorkflowTrackPoint 关联的信息。 例如,批注可以包含有关工作流可从此跟踪点获得的可能执行路径的信息,也可以包含要显示在应用程序中的信息。
ActivityTrackPoint
当活动的状态发生更改时,工作流实例将向运行时跟踪基础结构发出基于 ActivityExecutionStatus 值之一的活动状态事件。 ActivityTrackPoint 定义根工作流的可能执行路径中的关注点,由此类活动状态事件限定。 ActivityTrackPoint 包含使用 MatchingLocations 属性的匹配中包括的位置、从使用 ExcludedLocations 属性的匹配中排除的位置和使用 Extracts 属性匹配跟踪点时应从工作流实例中提取的数据。
Extracts 属性是一个 ExtractCollection,它包含 ActivityDataTrackingExtract 或 WorkflowDataTrackingExtract 对象。 将 ActivityDataTrackingExtract 对象添加到 ExtractCollection 时,Member 属性指向活动的字段或属性、此类字段或属性的成员或实现 IEnumerable 接口的字段或属性(或其中任何一个的成员)的单一元素。 当 ActivityTrackPoint 匹配时,成员的值被放入关联的 ActivityTrackingRecord 的 Body 属性。 在此特定活动事件期间,可以使用 WorkflowDataTrackingExtract 对象提取工作流的成员。
UserTrackPoint
活动设计器或工作流设计器可以使用重载 System.Workflow.ComponentModel.Activity.TrackData(System.Object) 和 System.Workflow.ComponentModel.ActivityExecutionContext.TrackData(System.Object) 方法来检测工作流,以便采用用户事件的形式将数据发出到运行时跟踪基础结构。 发出的数据称为“用户数据”。 与只会在状态更改时发生的活动状态事件和工作流状态事件不同,用户事件可以在工作流中检测到的任何位置发生。 检测工作流发出用户事件的原因有很多。 例如,工作流设计器可能需要传递有关工作流进度的逻辑状态信息,或者,活动设计器可能需要在其他时候(而非活动状态更改时)为活动成员提供机会。
UserTrackPoint 在与用户事件关联的根工作流实例的可能执行路径中定义一个关注点。 UserTrackPoint 包含匹配中包括的位置、从匹配中排除的位置,以及应在跟踪点匹配时从工作流实例中提取的任何附加数据。 您可以将 UserTrackPoint 添加到 System.Workflow.Runtime.Tracking.TrackingProfile.UserTrackPoints,以指示运行时跟踪基础结构在跟踪点匹配时将 UserTrackingRecord 发送到跟踪服务。 用户数据在 System.Workflow.Runtime.Tracking.UserTrackingRecord.UserData 中返回。 可以在工作流实例中的多个点匹配单一 UserTrackPoint。
UserTrackingLocation 包含工作流实例的可能执行路径中与用户事件关联的位置的匹配条件。 您可以将 UserTrackingLocation 对象添加到 MatchingLocations 以定义应包括在跟踪点匹配中的位置。 同样,您可以将 UserTrackingLocation 对象添加到 ExcludedLocations 以定义应从跟踪点匹配中排除的位置。 有关跟踪位置与 UserTrackPoint 之间的关系的信息,请参见本主题中的“跟踪位置”一节。
您可以将 ActivityDataTrackingExtract 对象和 WorkflowDataTrackingExtract 对象添加到 Extracts,以指定在跟踪点匹配时应从工作流实例中提取的数据。 提取的数据在 System.Workflow.Runtime.Tracking.UserTrackingRecord.Body 中返回。
您可以在 Annotations 中添加内容,以指定与跟踪点关联的附加信息。 这些批注在 Annotations 中返回。
跟踪位置
上一节中说明如何将跟踪点与 TrackingProfile 关联,以指定 Windows Workflow Foundation 运行时引擎中使用的跟踪服务所处理的事件的类型。 这些跟踪点使用跟踪位置来匹配工作流定义中的特定类型。
WorkflowTrackingLocation
WorkflowTrackingLocation 用于跟踪当工作流实例的状态更改时发生的事件。 使用 WorkflowTrackingLocation 类中定义的 Events 属性可以设置要匹配的工作流状态事件的列表。 这些事件可以是 TrackingWorkflowEvent 枚举中定义的值的任意组合。
ActivityTrackingLocation
ActivityTrackingLocation 用于跟踪当工作流实例中活动的状态更改时发生的事件。 ActivityTrackingLocation 与 ActivityTypeName 或 ActivityType 属性中指定的活动中引发的事件匹配。 当指定 Type 对象时,使用 ActivityType 属性。 但是,可以使用 ActivityTypeName 属性指定引用活动类型的非限定名称。 例如,若要指定 CodeActivity 活动的非限定名称,请将 ActivityTypeName 属性设置为“CodeActivity”。
使用 ActivityTrackingLocation 类中定义的 ExecutionStatusEvents 属性可以筛选跟踪服务所处理的活动级事件的类型。 必须至少匹配 ExecutionStatusEvents 集合中的一个 ActivityExecutionStatus 值,并且 Conditions 属性中的每个 TrackingCondition 必须为 true,才能使 ActivityTrackingLocation 匹配。 空列表指定没有要匹配的事件。
使用 ActivityTrackingCondition 可以对要跟踪的活动的粒度进行其他控制。 ActivityTrackingCondition 类的 Member 属性指定下列各项:属性或字段、活动属性或字段的成员或用于实现在想跟踪的活动中定义的 IEnumerable 接口的活动属性或字段(或其中之一的成员)的单一元素。 Value 属性表示想通过使用指定的 Operator 与 Member 属性进行比较的值。 例如,通过将 ActivityTrackingCondition 类中的这三个属性与 ActivityTrackingLocation 一起使用,可以指定只需要跟踪 Name 属性等于“CodeActivity1”的 CodeActivity 活动。
UserTrackingLocation
活动设计器或工作流设计器可以使用任何重载 System.Workflow.ComponentModel.Activity.TrackData(System.Object) 和 System.Workflow.ComponentModel.ActivityExecutionContext.TrackData(System.Object) 方法来检测工作流,以便采用用户事件的形式将数据发出到运行时跟踪基础结构。 发出的数据称为用户数据。 与只会在活动或工作流状态更改时发生的活动状态事件和工作流状态事件不同,用户事件可以在工作流中检测到的任何位置发生。 UserTrackingLocation 通过指定以下各项为这种位置定义匹配参数:用户数据的类型、必须从中发出用户数据的活动的类型、可以对此活动的一个或多个实例加以更精确限定的条件的集合、用户数据必须与之关联的可选键名、用户数据的派生类型是否应匹配,以及从活动(派生自指定活动的类型)中发出的用户数据是否应匹配。
注意: |
单一 UserTrackingLocation 可以引用工作流实例的可能执行路径中的多个实际位置。
|
您可以将 UserTrackingLocation 添加到 System.Workflow.Runtime.Tracking.UserTrackPoint.MatchingLocations 或 System.Workflow.Runtime.Tracking.UserTrackPoint.ExcludedLocations 属性,以便为 TrackingProfile 中的 UserTrackPoint 定义匹配参数。
条件
对于要由运行时跟踪基础结构匹配的 UserTrackingLocation,必须按如下顺序满足三个一般条件:
-
发出用户事件的活动必须与 ActivityType、ActivityTypeName、Conditions 和 MatchDerivedActivityTypes 属性指定的活动集合相匹配。
-
与用户数据关联的键(如果存在)必须与 KeyName 属性相匹配。
-
用户事件发出的用户数据的类型必须与 ArgumentType、ArgumentTypeName 和 MatchDerivedArgumentTypes 属性指定的用户数据类型的集合相匹配。
只有在所有这三个条件都得到满足时,运行时跟踪基础结构才会认为 UserTrackingLocation 匹配。
若要配置 UserTrackingLocation,必须设置 ArgumentTypeName 属性或 ArgumentType 属性以指定要匹配的用户数据类型。 还必须设置 ActivityTypeName 属性或 ActivityType 属性以指定必须从中发出要匹配的用户数据的活动类型。 您可以将 ActivityTrackingCondition 对象添加到 Conditions,以便更完全地限定必须从中发出用户数据的活动。 您可以设置 MatchDerivedArgumentTypes 属性,以指定应当匹配派生自用户数据类型(由 ArgumentTypeName 或 ArgumentType 属性指定)的用户数据;您还可以设置 MatchDerivedActivityTypes 属性,以指定应当匹配从派生自活动类型(由 ActivityTypeName 或 ActivityType 属性指定)的活动中发出的用户数据。
您可以设置 KeyName 以指定只应为此 UserTrackingLocation 匹配与指定键名关联的用户数据。 如果 KeyName 属性为空引用(在 Visual Basic 中为 Nothing),运行时跟踪结构将不会尝试匹配与用户数据关联的键。
使用跟踪配置文件对象模型
如前文所述,可以使用 Windows Workflow Foundation API 创建用于跟踪服务的 TrackingProfile 对象。 跟踪配置文件对象模型使用上一节中介绍的类集来创建 TrackingProfile 对象。 TrackingProfile 对象包含与工作流、活动和用户跟踪点相关的跟踪点。 每个跟踪点还具有一组匹配位置。 匹配位置说明了要跟踪的事件和活动。 除了匹配位置,还可以定义排除的位置。
在跟踪配置文件中使用的活动属性应使用活动对象模型中的名称进行映射。
警告: |
跟踪服务访问针对跟踪配置文件中的跟踪所设置的公共属性。 这会在工作流中导致意外的结果。
例如,创建一个具有公共增量计数器属性的工作流,而该属性在每次被访问时都会递增。 如果创建一个跟踪计数器属性的跟踪配置文件,则跟踪服务会访问计数器属性,而计数器会递增。 在这种情况下,工作流的业务逻辑之外的跟踪服务会意外地递增该属性。
|
下面的代码示例演示如何创建能够跟踪 CodeActivity 活动和以下三个事件的跟踪配置文件:Initialized、Executing 和 Closed。 该配置文件具有单一 ActivityTrackPoint 和一个匹配位置。
C# |
复制代码 |
static void CreateSimpleTrackingProfile()
{
TrackingProfile myProfile = new TrackingProfile();
ActivityTrackPoint myTrackPoint = new ActivityTrackPoint();
ActivityTrackingLocation myLocation = new ActivityTrackingLocation(typeof(CodeActivity));
myLocation.MatchDerivedTypes = false;
myLocation.ExecutionStatusEvents.Add(ActivityExecutionStatus.Initialized);
myLocation.ExecutionStatusEvents.Add(ActivityExecutionStatus.Executing);
myLocation.ExecutionStatusEvents.Add(ActivityExecutionStatus.Closed);
myTrackPoint.MatchingLocations.Add(myLocation);
myProfile.ActivityTrackPoints.Add(myTrackPoint);
myProfile.Version = new Version("1.0.0.0");
TrackingProfileSerializer trackingProfileSerializer = new TrackingProfileSerializer();
StringBuilder trackingProfileString = new StringBuilder();
using (StringWriter writer = new StringWriter(trackingProfileString, CultureInfo.InvariantCulture))
{
trackingProfileSerializer.Serialize(writer, myProfile);
Console.WriteLine(writer.ToString());
}
}
|
为 TrackingProfile 创建和使用 XML
您还可以通过使用 XML 写入跟踪文件。 执行此操作时,必须将 XML 反序列化到 TrackingProfile 中。 在上一节中创建的 TrackingProfile 的对应 XML 表示形式如下所示。
|
复制代码 |
<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<TrackingProfile xmlns="http://schemas.microsoft.com/winfx/2006/workflow/trackin
gprofile" version="1.0.0.0">
<TrackPoints>
<ActivityTrackPoint>
<MatchingLocations>
<ActivityTrackingLocation>
<Activity>
<Type>System.Workflow.Activities.CodeActivity, System.Wo
rkflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad36
4e35</Type>
<MatchDerivedTypes>false</MatchDerivedTypes>
</Activity>
<ExecutionStatusEvents>
<ExecutionStatus>Initialized</ExecutionStatus>
<ExecutionStatus>Executing</ExecutionStatus>
<ExecutionStatus>Closed</ExecutionStatus>
</ExecutionStatusEvents>
</ActivityTrackingLocation>
</MatchingLocations>
</ActivityTrackPoint>
</TrackPoints>
</TrackingProfile>
|
使用跟踪配置文件对象模型和在 Windows Workflow Foundation 中包括的 TrackingProfileSerializer 类还可以构建 TrackingProfile 的 XML 表示形式。
下面的示例演示如何将 TrackingProfile 对象序列化为 XML 数据。