WorkflowServiceHost: получить текущее состояние и возможные переходы конечного автомата. - PullRequest
0 голосов
/ 28 мая 2019

Как узнать текущее состояние и будущие состояния StateMachine?Я пытался использовать StateMachineStateTracker , но он не работает с WorkflowServiceHost, хотя он отлично работает с WorkflowApplication (но я не могу понять, как запустить Delay с помощью SQL Persistence, когда время истекло).Мой код:

public static System.ServiceModel.Activities.WorkflowServiceHost Host { get; set; }

public static BookmarkEndpoint Endpoint { get; set; }

public static string ConnectionString { get; private set; }

private static SqlWorkflowInstanceStore instanceStore;

static WorkflowService()
{
    Host = new System.ServiceModel.Activities.WorkflowServiceHost(new Activity1(), new Uri("http://localhost:50574"));
    Endpoint = new BookmarkEndpoint(new BasicHttpBinding(), new EndpointAddress("http://localhost:50574/workflow"));
    Host.AddServiceEndpoint(Endpoint);

    ConnectionString = ConfigurationManager.ConnectionStrings["WFStorage"].ConnectionString;

    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);

    if (!SqlWorkflowInstanceStoreManager.InstanceStoreExists(builder.InitialCatalog, ConnectionString))
        SqlWorkflowInstanceStoreManager.CreateInstanceStore(builder.InitialCatalog, ConnectionString);

    instanceStore = new SqlWorkflowInstanceStore(ConnectionString)
    {
        InstanceEncodingOption = InstanceEncodingOption.GZip,
        InstanceCompletionAction = InstanceCompletionAction.DeleteAll,
        InstanceLockedExceptionAction = InstanceLockedExceptionAction.AggressiveRetry,
        HostLockRenewalPeriod = new TimeSpan(0, 0, 30),
        RunnableInstancesDetectionPeriod = new TimeSpan(0, 0, 5)
    };

    //StateMachineStateTracker.Promote(instanceStore);

    var createWorkflowOwnerCommand = new CreateWorkflowOwnerCommand();
    var handle = instanceStore.CreateInstanceHandle();

    try
    {
        instanceStore.BeginExecute(handle, createWorkflowOwnerCommand, TimeSpan.FromSeconds(30), OnInstanceStoreEndExecute, null);
    }
    catch
    {
        throw new FaultException<WorkflowFaultException>(new WorkflowFaultException(""), new FaultReason("An error has occured setting up the InstanceStore"));
    }

    Host.DurableInstancingOptions.InstanceStore = instanceStore;

    var stateTracker = StateMachineStateTracker.Attach(Host);
    //Host.WorkflowExtensions.Add(stateTracker);
    //Host.WorkflowExtensions.Add(new StateTrackerPersistenceProvider(stateTracker));

    Host.Open();
}
...