我为审批系统开发了工作流程。我用过书签和 持久性功能可在卸载前保持应用状态。
工作流
发送电子邮件至 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();
}