У меня есть настраиваемая служба отслеживания, которая работает уже некоторое время с более чем 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);
}
}
}
}