0

基本想法是我有一个网站和一个工作流程。我需要在我的工作流程中捕获来自 aspx 页面的按钮点击。

我有一个包含 worflow 项目和网站项目的解决方案,并且 web.config 和 global.asax 已设置为与 WF 一起使用。还设置了持久性服务。

我创建了一个 StateMachine 工作流程。有几个状态(StateActivity)包含 EventDrivenActivity 实例,其中有 HandleExternalEventActivity 实例。为了正确设置后者以便应用程序可以编译,我创建了一个用 ExternalDataExchange 属性修饰的接口,并公开了必要的事件。然后我创建了一个实现这个接口的类。

这就是我所得到的。现在我需要将类连接到我的 aspx 页面;页面上的事件需要触发类中的事件。

我的代码看起来像这样:

<ExternalDataExchange()> _
Public Interface ICatWorkflow
            Property RequestId() As Guid
            ...
            Sub requestInfoEmail()
        ...
        Event onReception(ByVal sender As Object, ByVal e As ExternalDataEventArgs) 
End Interface

Class MyObject
   Implements ICatWorkflow
        Public Property RequestId() As Guid Implements ICatWorkflow.RequestId
            ...
        End Property
        Public Sub requestInfoEmail() Implements ICatWorkflow.onReception
            ...
        End Sub
        Event onReception(ByVal sender As Object, ByVal e As ExternalDataEventArgs)
end class

在我的 form.aspx 上,有一个按钮,而在 form.aspx.vb 页面上,有一个相应的事件处理程序:

Protected Sub btnReception_Click(ByVal sender As Object, ByVal e As System.EventArgs)             
      Handles btnReception.Click
        ...
End Sub

然后去哪儿?

4

1 回答 1

0

我假设您正在为每个用户会话运行一个工作流。如果是这样,您需要将工作流 instanceiId 存储在您可以访问的地方。所以要么把它放在 cookie 中,要么放在 Session 对象中。我更喜欢 cookie,因为即使会话超时或 AppDomain 被 IIS 回收,它也能正常工作。

接下来,您需要获取对 ExternalDataExchange 服务的引用。如果您有对工作流运行时的引用,这很容易。您只需要 workflowRuntime.GetService()。接下来,您使用该服务引发将消息发送到您的工作流的事件。

于 2009-04-16T16:54:55.520 回答