Я использую WF 4 с ASP.NET, и в качестве части рабочего процесса системе может потребоваться перенаправить на другие страницы, чтобы пользователь мог вводить дополнительную информацию при определенных обстоятельствах.После того, как они ввели эту информацию, система должна возобновить рабочий процесс с того места, где она остановилась.
У меня есть этот код на начальной странице, который запускает процесс и действие в рабочем процессе, которое устанавливает закладку.
static InstanceStore instanceStore;
static AutoResetEvent instanceUnloaded = new AutoResetEvent(false);
static Guid id;
protected void Page_Load(object sender, EventArgs e)
{
SetupInstanceStore();
}
protected void btnStartWorkflow_Click(object sender, EventArgs e)
{
app = Session["applicant"];
Dictionary<string, object> workflowInputs = new Dictionary<string, object>();
workflowInputs.Add("Applicant", app.Applicant);
WorkflowApplication workflowApplication = new WorkflowApplication(new IdentityCheckActivites.IdentityCheckWorkflow(), workflowInputs);
workflowApplication.InstanceStore = instanceStore;
//returning IdleAction.Unload instructs the WorkflowApplication to persist application state and remove it from memory
workflowApplication.PersistableIdle = (a) =>
{
return PersistableIdleAction.Persist;
};
workflowApplication.Unloaded = (a) =>
{
instanceUnloaded.Set();
};
workflowApplication.Completed = (a) =>
{
instanceUnloaded.Set();
};
workflowApplication.Persist();
id = workflowApplication.Id;
workflowApplication.Run();
Session["id"] = id;
workflowApplication.Idle = (a) =>
{
instanceUnloaded.Set();
};
instanceUnloaded.WaitOne();
var bookmarks = workflowApplication.GetBookmarks();
if (bookmarks != null && bookmarks[0].OwnerDisplayName == "CC")
{
workflowApplication.Unload();
Context.Response.Redirect("SecondPage.aspx");
}
Context.Response.Redirect("FinalPage.aspx");
}
private static void SetupInstanceStore()
{
instanceStore = new SqlWorkflowInstanceStore(@"Data Source=xxx;Initial Catalog=SampleInstanceStore;User Id=xxx;Password=xxx;Asynchronous Processing=True");
InstanceHandle handle = instanceStore.CreateInstanceHandle();
InstanceView view = instanceStore.Execute(handle, new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));
handle.Free();
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
}
Кажется, что это работает очень хорошо, поскольку он сохраняет рабочий процесс в базе данных, и, если установлена закладка, я хочу перенаправить на вторую страницу, чтобы пользователь мог ввести больше данных.
Это часть кода, с которой у меня возникают проблемы: -
var bookmarks = workflowApplication.GetBookmarks();
if (bookmarks != null && bookmarks[0].OwnerDisplayName == "CC")
{
workflowApplication.Unload();
Context.Response.Redirect("SecondPage.aspx");
}
Context.Response.Redirect("FinalPage.aspx");
Если есть набор закладок, я перенаправляю на промежуточную страницу, если нет и вмешательство пользователя не требуется,страница просто перенаправит на последнюю страницу.
Это работает, если закладка установлена, но если нет, оператор workflowApplication.GetBookmarks () выдает исключение, сообщающее, что рабочий процесс завершен.
Кажется, я не могу найти способ определить на этом этапе, в каком состоянии находится рабочий процесс, чтобы я мог перенаправить на соответствующую страницу.
Может быть, у меня вообще неправильная идея, хотя я не могу найти много советов по этому вопросу.
Есть идеи?
Спасибо,
Джим.