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

时间:2011-11-06 09:56:58

标签: serialization assemblies workflow-foundation strongname

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

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

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

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

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 

替换为:

some.namespace.foobar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=123456789acb

我似乎取得了很好的进展,但是当我转换我的状态机工作流程时,我作为服务添加的自定义跟踪服务不再针对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>

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

根据要求,这里是自定义跟踪服务,但问题是主机“绑定”自定义跟踪服务,而不是跟踪服务本身 - 我知道这是因为在自定义跟踪服务的实例中触发,没有任何方法,包括构造函数被调用。

  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);
                    }
            }                    
    }
}

1 个答案:

答案 0 :(得分:0)

事实证明,最后一步很简单。问题是WF和microsoft have outlined the answer here中的错误。

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

[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
       }

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