Пользовательская служба отслеживания SQL WF перестала работать со старыми рабочими процессами?

У меня есть настраиваемая служба отслеживания, которая работает уже некоторое время с более чем 1500 текущими рабочими процессами, сейчас я нахожусь в процесс управления версиями рабочих процессов, чтобы я мог выпустить некоторые запросы на изменение.

К сожалению, изначально система не была развернута со строго типизированными сборками, поэтому я сейчас разбираюсь с этим беспорядком.

Мне нужно использовать комбинацию настраиваемого SerializationBinder для преобразования PublicKeyToken = null в мой новый PublicKeyToken и делегата AppDomain_AssemblyResolve, чтобы указать хосту на строго типизированные сборки - Ссылка здесь .

Мне также пришлось заменить содержимое связанных строк в таблице [Type], которая поставляется с SqlTrackingService по умолчанию, чтобы ссылаться на новый 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 следующим образом:


       ...other services here...
      

Есть идеи, что еще мне нужно изменить, чтобы это работало для уже существующих рабочих процессов?

По запросу, вот настраиваемая служба отслеживания, хотя проблема связана с привязкой хоста к настраиваемой службе отслеживания, а не самой службой отслеживания - я знаю это, потому что в случае, когда настраиваемая служба отслеживания не запускается, ни один из методов, включая вызывается конструктор.

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

6
задан Tr1stan 17 November 2011 в 12:13
поделиться