ワークフローが実際に終了するのを防ぐカスタムSQLワークフロー永続化サービスを作成しました。これにより、エラーの原因となった遷移が発生する前に、ワークフローを以前の状態のままにします。
public class CustomSqlWorkflowPersistenceService : SqlWorkflowPersistenceService
{
public CustomSqlWorkflowPersistenceService (string connectionString) : base(connectionString)
{
}
public CustomSqlWorkflowPersistenceService (NameValueCollection parameters) : base(parameters)
{
}
public CustomSqlWorkflowPersistenceService (string connectionString, bool unloadOnIdle, TimeSpan instanceOwnershipDuration, TimeSpan loadingInterval) : base(connectionString, unloadOnIdle, instanceOwnershipDuration, loadingInterval)
{
}
protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
WorkflowStatus workflowStatus = GetWorkflowStatus(rootActivity);
if (workflowStatus == WorkflowStatus.Terminated)
{
string workflowError = GetSuspendOrTerminateInfo(rootActivity);
if (!string.IsNullOrEmpty(workflowError))
{
string error = string.Format("Workflow terminated, forcing an abort! {0}", workflowError);
throw new Exception(error);
}
}
base.SaveWorkflowInstanceState(rootActivity, unlock);
}
}
WFを強制的に終了させたい場合、これは明らかに苦痛になりますが、回避できると確信しています。