玄铁剑

成功的途径:抄,创造,研究,发明...
posts - 128, comments - 42, trackbacks - 0, articles - 174

SqlTrackingService 类表示一个功能完全的跟踪服务。 使用此服务可以收集和存储跟踪信息,还可以存储跟踪配置文件,并在工作流运行时引擎请求时提供这些配置文件。 SQL 跟踪服务将运行时跟踪基础结构发送给它的跟踪数据写入到 SQL 数据库。

在许多情况下,对于 SqlTrackingService 服务来说,保持其数据库和工作流运行时引擎状态之间的一致性十分重要。 因此,SqlTrackingService 类实现了 IPendingWork 接口,并可参与到由 WorkflowCommitWorkBatchService 服务提供的工作流事务批处理功能中。 您可以设置 IsTransactional 属性,或将适当的参数传递给构造函数,以便将 SqlTrackingService 服务配置为参与批处理,并将表示 SQL 数据库挂起更改的对象添加到工作批次。

SqlTrackingService 服务还会在其数据库中保留跟踪配置文件。 工作流运行时引擎知道对所使用的任何跟踪配置文件所做的更改。 SqlTrackingService 服务实现 IProfileNotification 接口,并定期检查其数据库中的跟踪配置文件,以便将对其数据库中存储的 TrackingProfile 所做的更改通知工作流运行时引擎。 可以设置 ProfileChangeCheckInterval 属性或将适当的参数传递给构造函数来设置间隔,SqlTrackingService 服务将按该间隔检查其跟踪配置文件。

Note注意:

SqlTrackingService 不会在跟踪数据库中存储主机信息。 在多主机情况下,不能使用此服务检索主机信息。 为此,必须实现自定义跟踪服务,该服务可存储所有相关主机信息,如主机 GUID 或主机名。

Note注意:

如果在工作流应用程序中同时使用 SqlTrackingServiceSqlWorkflowPersistenceService,建议为持久性和跟踪使用单一数据库。

创建 SQL 跟踪数据库

Windows Workflow Foundation 安装程序并不安装 SqlTrackingService 服务所需的数据库,但会安装为该服务创建和配置数据库所用的 SQL 脚本。 本部分详细说明正确配置供 SqlTrackingService 服务使用的 SQL Server 数据库所需执行的步骤。

Note注意:

由 Windows Workflow Foundation 安装的 SQL 服务使用 Microsoft SQL Server 来存储信息。 对于这些任务,可以使用 Microsoft SQL Server 2005 Express、SQL Server 2000 或更高版本或 SQL Server 2000 Desktop Engine (MSDE)。

创建 SQL 跟踪数据库

  • 在 Microsoft SQL Server 2005 Express、SQL Server 2000 或更高版本或 SQL Server 2000 Desktop Engine (MSDE) 中,使用以下 SQL 查询语句创建一个名为 WorkflowTrackingStore 的新数据库:

      CopyCode image复制代码
    CREATE DATABASE WorkflowTrackingStore
Note注意:

如果在工作流应用程序中同时使用 SqlTrackingServiceSqlWorkflowPersistenceService,建议为持久性和跟踪使用单一数据库。

  1. 在 SQL 查询分析器工作区中,从可用数据库列表中选择在步骤 1 中创建的数据库。

  2. 在“文件”菜单上,单击“打开”,然后打开 SQL 脚本 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<语言>\SqlTracking_Schema

  3. 通过单击“执行”或按 F5 来运行查询,以便创建 SQL 跟踪服务表。

  4. 在“文件”菜单上,单击“打开”,然后打开 SQL 脚本 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<语言>\SqlTracking_Logic

  5. 通过单击“执行”或按 F5 来运行查询,以便创建 SQL 跟踪服务存储过程。

向运行时引擎添加 SqlTrackingService

可以编程方式或通过使用应用程序配置文件,向 Windows Workflow Foundation 运行时引擎添加运行时服务。

修改 SqlTrackingService 的 App.config

  1. 在 App.config 文件的 Services 元素中,创建一个名为 add 的新元素。

  2. add 元素添加名为 type 的属性,该属性的值为 System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

  3. add 元素添加名为 connectionString 的属性,该属性的值为 =Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;

Note注意:

可能需要修改连接字符串,具体取决于 SQL Server 的配置。 此处显示的连接字符串假定,数据库名称为 WorkflowTrackingStore,且 SQL Server 已安装在用于应用程序开发的同一个系统上。

  1. <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>

以编程方式向运行时引擎添加 SqlTrackingService

  • 调用 WorkflowRuntime 类中定义的 AddService 方法,传递 SqlTrackingService 的新实例。

    下面的示例演示如何使用与前面的过程中显示的示例相同的配置来创建 SqlTrackingService

    [C#]

      CopyCode image复制代码
    using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                    {
                    // Create the SqlTrackingService.
                    string connectionString ="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;";
                    SqlTrackingService trackService = new SqlTrackingService(connectionString);
                    // Add the SqlTrckingService to the runtime engine
                    workflowRuntime.AddService( trackService );
                    // ...
                    }

将 TrackingProfile 与工作流类型关联

SqlTrackingService 服务添加到运行时引擎之后,可立即使用该服务。 如果未指定跟踪配置文件,当 UseDefaultProfile 属性为 true 时,SqlTrackingService 服务将使用默认的配置文件。 在这种情况下,如果您使用默认的配置文件,则会为每个工作流和活动事件保存跟踪信息。 但是,若要控制所跟踪的信息,应该定义要与 SqlTrackingService 一起使用的 TrackingProfile。 不过,如果 UseDefaultProfile 属性为 false,在没有一个跟踪配置文件与要启动的工作流类型关联时,SqlTrackingService 不会使用默认跟踪配置文件。

Windows Workflow Foundation 提供的 SQL 存储过程包括名为 UpdateTrackingProfile 的过程。 通过此过程,可以传入要跟踪的工作流的类型名称、其中定义了工作流的程序集、跟踪配置文件版本的版本字符串,以及序列化为 XML 的跟踪配置文件。

下面的示例演示如何以编程方式创建 TrackingProfile 对象。 在此示例中,使用所创建的 TrackingProfile 对象,可以只跟踪工作流中定义的 CodeActivity 活动。

C#  CopyCode image复制代码
static void CreateTrackingProfile()
            {
            TrackingProfile profile = new TrackingProfile();
            ActivityTrackPoint trackPoint = new ActivityTrackPoint();
            // Track CodeActivity activities only.
            ActivityTrackingLocation location = new ActivityTrackingLocation
            (typeof(System.Workflow.Activities.CodeActivity));
            // Add all activity tracking events.
            foreach (ActivityExecutionStatus s in
            Enum.GetValues(typeof(ActivityExecutionStatus)))
            {
            location.ExecutionStatusEvents.Add(s);
            }
            trackPoint.MatchingLocations.Add(location);
            profile.ActivityTrackPoints.Add(trackPoint);
            profile.Version = new Version("1.0.0.0");
            WorkflowTrackPoint wtp = new WorkflowTrackPoint();
            WorkflowTrackingLocation wtl = new WorkflowTrackingLocation();
            // Add all workflow tracking events.
            foreach (TrackingWorkflowEvent s in
            Enum.GetValues(typeof(TrackingWorkflowEvent)))
            {
            wtl.Events.Add(s);
            }
            wtp.MatchingLocation = wtl;
            profile.WorkflowTrackPoints.Add(wtp);
            // Serialize tracking profile and save to SQL.
            TrackingProfileSerializer serializer = new TrackingProfileSerializer();
            StringWriter writer = new StringWriter(new StringBuilder(),
            CultureInfo.InvariantCulture);
            serializer.Serialize(writer, profile);
            InsertTrackingProfile(writer.ToString());
            }

在此代码示例的最后一行中,调用了名为 InsertTrackingProfile 的方法。 此方法在下一个示例中定义,它将 UpdateTrackingProfile 存储过程与新的 TrackingProfile 结合使用,以更新跟踪数据库。

C#  CopyCode image复制代码
static void InsertTrackingProfile(string profile)
            {
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "dbo.UpdateTrackingProfile";
            cmd.Connection = new SqlConnection(Program.connectionString);
            try
            {
            cmd.Parameters.Clear();
            SqlParameter typFullName = new SqlParameter();
            typFullName.ParameterName = "@TypeFullName";
            typFullName.SqlDbType = SqlDbType.NVarChar;
            typFullName.SqlValue = typeof(SimpleWorkflow).ToString();
            cmd.Parameters.Add(typFullName);
            SqlParameter assemblyFullName = new SqlParameter();
            assemblyFullName.ParameterName = "@AssemblyFullName";
            assemblyFullName.SqlDbType = SqlDbType.NVarChar;
            assemblyFullName.SqlValue = typeof(SimpleWorkflow).Assembly.FullName;
            cmd.Parameters.Add(assemblyFullName);
            SqlParameter versionId = new SqlParameter();
            versionId.ParameterName = "@Version";
            versionId.SqlDbType = SqlDbType.VarChar;
            // The version ID must match the tracking profile version
            // number.
            versionId.SqlValue = "1.0.0.0";
            cmd.Parameters.Add(versionId);
            SqlParameter trackingProfile = new SqlParameter();
            trackingProfile.ParameterName = "@TrackingProfileXml";
            trackingProfile.SqlDbType = SqlDbType.NVarChar;
            trackingProfile.SqlValue = profile;
            cmd.Parameters.Add(trackingProfile);
            cmd.Connection.Open();
            cmd.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
            Console.WriteLine(e.Message);
            Console.WriteLine("The Tracking Profile was not inserted. " +
            "if you want to add a new Tracking Profile, modify the version " +
            "string in the profile by specifying a higher version number.");
            return;
            }
            finally
            {
            if ((null != cmd) && (null != cmd.Connection) &&
            (ConnectionState.Closed != cmd.Connection.State))
            cmd.Connection.Close();
            }
            }

创建并启动所跟踪的工作流类型之前,应该调用此处显示的定义 TrackingProfile 的过程。 工作流启动时,SqlTrackingService 会检测到应该使用 TrackingProfile,并会相应地处理跟踪信息。

Note注意:

如果更改了与跟踪配置文件关联的工作流类型,则更新跟踪配置文件的版本号非常重要,否则跟踪服务无法将跟踪数据与以前的工作流类型关联。

有关如何从跟踪数据库提取跟踪信息的更多信息,请参见使用 SqlTrackingQuery 查询 SqlTrackingService 数据。 有关 Windows Workflow Foundation 中的数据维护功能(用于帮助在 SqlTrackingService 数据库中组织跟踪数据)的更多信息,请参见SqlTrackingService 的数据维护

只有注册用户登录后才能发表评论。