If you need to retrieve internal state for workflows executed by Workflow Manager, regardless if they were launched from SharePoint or any other .NET application, to figure out for example:
- Why a workflow was suspended or terminated:
- How long did it take
- The value of a specific MappedVariables,
- Etc.
You can do at least in 3 different ways, it is a matter of preferences.
1. Programmatically by using the .NET API Microsoft.Workflow.Client
static string baseAddress = https://<WFM URI>:12290/;
static string workflowName = "<MyWorkflowName>";
staticvoid Main(string[] args)
{
WorkflowManagementClient client = WorkflowUtils.CreateForSample(baseAddress, "<MyScope>");
var SuspendedWorkflows = client.Instances.Get(0, 100, workflowName, Microsoft.Activities.WorkflowInstanceStatus.Suspended);
Console.WriteLine("Suspended Workflows: {0} \n\n", SuspendedWorkflows.Count);
foreach (var workflow in SuspendedWorkflows{
Console.WriteLine("\tInstance Id: {0}", workflow.InstanceName);
Console.WriteLine("\tCreation Date: {0}", workflow.CreationTime);
Console.WriteLine("\tLast Modified Date: {0}", workflow.LastModified);
Console.WriteLine("\tWorkflow Status Details: {0}\n", workflow.WorkflowStatusDetails);
}
Console.Write("Press any key to continue ...");
Console.ReadKey();
}
Note: You need to add a reference to following assemblies: Microsoft.Activities.dll, Microsoft.Workflow.Client.dll and Microsoft.Workflow.Samples.Common.dll
2. Using REST call directly from a Web Browser
Since Workflow Manager WebSite is REST based, you can call it directly from an Internet explorer like below:
3. Query directly against WFM Database
/*Query to get all Suspeded Workflows*/
SELECT InstanceId, ExecutionTime, LastModified, WorkflowName, WorkflowStatus, WorkflowStatusDetails
FROM [WFInstanceManagementDB].[dbo].[Instances] with(nolock)
where WorkflowStatus ='suspended'
/*Query to get MappedVariables for a specific Suspeded Workflows*/
SELECT t1.InstanceId,t2.Name,t2.Value, t1.ExecutionTime, t1.LastModified, t1.WorkflowName, t1.WorkflowStatus, t1.WorkflowStatusDetails
FROM [WFInstanceManagementDB].[dbo].[Instances] t1 with(nolock)innerjoin [WFInstanceManagementDB].[dbo].[MappedVariables] t2 with(nolock)on t1.InstanceId = t2.InstanceId
where t1.InstanceId ='<InstanceID>'
Hope it helps!!