WF自定义SQL跟踪服务已停止为旧工作流程工作?

Tr1*_*tan 6 serialization strongname assemblies workflow-foundation

我有一个已经运行一段时间的自定义跟踪服务,现在有超过1500个实时工作流程,我现在正在对工作流进行版本控制,以便我可以发布一些更改请求.

不幸的是,系统最初并没有部署强类型程序集,因此我正在对这个混乱进行排序.

我必须使用自定义SerializationBinder的混合来将PublicKeyToken = null转换为我的新PublicKeyToken,并使用AppDomain_AssemblyResolve委托来帮助将主机指向现在强类型的程序集 - 这里引用.

我还必须替换默认SqlTrackingService附带的[Type]表中相关行的内容来引用新的PublicKeyToken,所以:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
Run Code Online (Sandbox Code Playgroud)

替换为:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=123456789acb
Run Code Online (Sandbox Code Playgroud)

我似乎取得了很好的进展,但是当我转换状态机工作流程时,我作为服务添加的自定义跟踪服务不再针对1.0.0.0版本的工作流程,而是适用于新创建的2.0.0.0版工作流程.

注意:默认的SqlTrackingService在两个版本的工作流上仍然正常运行,这只是现有持久工作流上的自定义跟踪服务的问题.

自定义跟踪服务始终通过app.config添加,如下所示:

<Services>
       ...other services here...
      <add type="some.namespace.ActiveStateTrackingService, some.namespace.extensions" assembly="uk.gov.gsi.cma.extensions" />
</Services>
Run Code Online (Sandbox Code Playgroud)

关于我需要改变什么以使其适用于现有工作流程的任何想法?

根据要求,这里是自定义跟踪服务,虽然问题是主机"绑定"自定义跟踪服务,而不是跟踪服务本身 - 我知道这是因为在没有触发自定义跟踪服务的情况下,没有任何方法,包括构造函数被调用.

  public class ActiveStateTrackingService : TrackingService
{
    protected override TrackingProfile GetProfile(Guid workflowInstanceId)
    {
        return GetDefaultProfile();
    }

    protected override TrackingProfile GetProfile(Type workflowType, Version profileVersionId)
    {
        return GetDefaultProfile();
    }

    protected override TrackingChannel GetTrackingChannel(TrackingParameters parameters)
    {
        return new ActiveStateTrackingChannel(parameters);
    }

    protected override bool TryGetProfile(Type workflowType, out TrackingProfile profile)
    {
        profile = GetDefaultProfile();
        return true;
    }

    protected override bool TryReloadProfile(Type workflowType, Guid workflowInstanceId, out TrackingProfile profile)
    {
        profile = null;
        return false;
    }

    private TrackingProfile GetDefaultProfile()
    {
        TrackingProfile profile = new TrackingProfile();
        profile.Version = new Version(1, 0);

        // Add tracking point for state activity executing
        ActivityTrackPoint statePoint = new ActivityTrackPoint();
        ActivityTrackingLocation location = new ActivityTrackingLocation(typeof(StateActivity), new ActivityExecutionStatus[] { ActivityExecutionStatus.Executing });
        statePoint.MatchingLocations.Add(location);
        profile.ActivityTrackPoints.Add(statePoint);

        return profile;
    }
}

public class ActiveStateTrackingChannel : TrackingChannel
{

    private TrackingParameters param;

    public ActiveStateTrackingChannel(TrackingParameters parameters)
    {
        param = parameters;
    }

    protected override void InstanceCompletedOrTerminated()
    {
        return;
    }

    protected override void Send(TrackingRecord record)
    {

        // get the tracking record and write out the name of the state.  
        var r = record as ActivityTrackingRecord;

        if (r != null)
            if (!string.IsNullOrEmpty(r.QualifiedName))
            {
                using (ICaseService caseService = new CaseService())
                    {
                        SomeServiceLayer.UpdateCurrentStateOutsideOfTheWorkflow(param.ContextGuid, r.ParentContextGuid, r.QualifiedName);
                        Console.WriteLine("*** Current State: {0} ***", r.QualifiedName);
                    }
            }                    
    }
}
Run Code Online (Sandbox Code Playgroud)

Tr1*_*tan 0

事实证明,最后一步很简单。该问题是 WF 中的一个错误,微软已在此处概述了答案

您基本上必须使用一个属性来装饰您的自定义跟踪服务类,该属性允许您解析旧的跟踪服务引用,如下所示:

[System.Workflow.Runtime.Tracking.PreviousTrackingService("myNamespace.Workflow.StateMachineTrackingService, myNamespace.Workflow.StateMachineTracking, Version=1.2.0.1, Culture=neutral, PublicKeyToken=gr4b2191f58h9e0d")]
public class StateMachineTrackingService : TrackingService
       {
         //Body of your custom tracking service here
       }
Run Code Online (Sandbox Code Playgroud)

你瞧,我以前坚持的工作流程现在解决了新版本的跟踪服务。