Не удается перенаправить на другую страницу, используя ASP.NET и WF 4 - PullRequest
0 голосов
/ 04 мая 2011

Я использую 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 () выдает исключение, сообщающее, что рабочий процесс завершен.

Кажется, я не могу найти способ определить на этом этапе, в каком состоянии находится рабочий процесс, чтобы я мог перенаправить на соответствующую страницу.

Может быть, у меня вообще неправильная идея, хотя я не могу найти много советов по этому вопросу.

Есть идеи?

Спасибо,

Джим.

Ответы [ 3 ]

0 голосов
/ 13 мая 2011

Не уверен, правильно ли я понимаю, но, похоже, ваш контроллер страниц просматривает состояние рабочего процесса, чтобы понять, какую страницу перенаправить? Проблема в том, что состояние может отсутствовать, если экземпляр WF завершился?

Если вышеизложенное верно, то, возможно, подход неверен. Более подходящий подход может заключаться в том, чтобы служба WF WCF в AppFabric (коррелированная по идентификатору сеанса) обрабатывала запрос веб-сайта напрямую. (Если пользователь в определенном сеансе посещает сайт, WF определяет, какую страницу отображать, и если пользователь нажимает определенную кнопку, затем отправляет сообщение WF WCF, используя привязку к трубе net)

0 голосов
/ 25 мая 2013

вместо

               workflow.idle 

вам нужно

           wfApp.PersistableIdle 

и не забудьте

            instanceUnloaded.Set();
0 голосов
/ 05 мая 2011

Я не думаю, что есть способ напрямую определить, завершен ли рабочий процесс из WorkflowApplication (за исключением перехвата и проверки генерируемого исключения).

Но вы могли бы установить флаг в стороне от вашегоЗавершенный делегат, который выполняется только в том случае, если не установлена ​​закладка и рабочий процесс завершен.Затем вы можете проверить этот флаг перед вызовом GetBookmarks ().

...