托管网络应用程序中的WF 4.5书签和持久性

时间:2016-09-29 10:17:36

标签: c# .net workflow workflow-foundation-4 workflow-activity

我为审批系统开发了工作流程。我用过书签和 持久性功能可在卸载前保持应用状态。

工作流

发送电子邮件至 P1 以获得批准。

如果 P1 获得批准,则接下来将下一个批准请求发送到 P2

我正在使用WorkflowApplication类从我的asp.net应用程序中调用workflow

我在localhost(IIS Express)上运行我的asp.net网站。

我不知道如何处理应用程序关闭,重启,方案  对于我目前的工作流程。

我的代码总是首先点击app.run

因此,假设email to sent P1获得批准,同时我停止了IIS Express / VS.

现在我再次启动网络应用程序 - app.run将再次启用,因此我将失去先前的持久性。正确?

如何确保工作流程始终在托管应用程序上运行?在IIS服务器上的实际环境?无论何时调用工作流,它应首先检查以前的状态是否仍然存在?如果是,那么加载并从那一点开始运行?

任何链接,帮助将不胜感激

我的想法: 在关于app.run的Web应用程序重启时,只需检查持久性数据库,如果之前的状态仍然存在,请将其读出并从该点开始重新启动。

但是我真的想知道,WF 4.5不能很好地处理好自己?在这种情况下,workflowhostservice将如何帮助我?

在我的下面的代码中,我在恢复书签1和书签2之前调用app.run。

代码:

AutoResetEvent syncEvent = new AutoResetEvent(false);
Guid wfID;
ApprovalWorkflow appFlow = new ApprovalWorkflow 
    { 
        approvalStatus =  "approved" 
    };
WorkflowApplication app = new WorkflowApplication(appFlow);

InstanceStore store = new SqlWorkflowInstanceStore(@"Data Source=.\SQLEXPRESS;Initial Catalog=WF45GettingStartedTutorial;Integrated Security=True");
InstanceHandle handle = store.CreateInstanceHandle();
InstanceView view = store.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
handle.Free();
store.DefaultInstanceOwner = view.InstanceOwner;
app.InstanceStore = store;


app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
{
    return PersistableIdleAction.Unload;
};

app.Unloaded = delegate(WorkflowApplicationEventArgs e)
{
    syncEvent.Set();
};

wfID = app.Id;
app.Run();
syncEvent.WaitOne();

// resume bookmark 1
appFlow = new ApprovalWorkflow { approvalStatus = "approved" };
app = new WorkflowApplication(appFlow);
app.InstanceStore = store;

app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
{
    return PersistableIdleAction.Unload;
};

app.Unloaded = delegate(WorkflowApplicationEventArgs e)
{
    syncEvent.Set();
};

app.Load(wfID);
app.ResumeBookmark("B1", "test1");
syncEvent.WaitOne();

// resume bookmark 2
appFlow = new ApprovalWorkflow { approvalStatus = "approved" };
app = new WorkflowApplication(appFlow);
app.InstanceStore = store;

app.Completed = delegate(WorkflowApplicationCompletedEventArgs e)
{
    syncEvent.Set();
};
app.Unloaded = (workflowApplicationEventArgs) =>
{
    syncEvent.Set();
};

app.Load(wfID);
app.ResumeBookmark("B2", "test");
syncEvent.WaitOne();
}

0 个答案:

没有答案