Asp.Net基于Web的工作流程

时间:2011-06-03 03:12:18

标签: .net asp.net .net-4.0 workflow

情景:

我正在开发基于Web的应用程序。在我的应用程序中,用户从撰稿人请求文章撰写服务。然后,撰稿人将继续创作并将文章提交给客户。然后客户可以批准或拒绝这些文章。所有这些行动都有地位。

业务问题:

01.我需要(以下给出的示例动作)
02.当文章状态发生变化时发送通知(电子邮件) 03.根据数据库中的表现(例如:拒绝与批准)更新撰稿人的个人资料 04.如果某篇文章被拒绝x次,请通知申请管理员 05.将来可能会增加更多的业务逻辑
基本上所有流程都是电子邮件发送或数据库调用。

我的方法:

我在中间层提出了一个功能(是的,我的应用程序是3层。)。

    Public Sub ExecuteWorkFlow(ByVal requestid As Integer, ByVal oldStatus As ServiceStatus, ByVal newStatus As ServiceStatus)

    Try
            If oldStatus.Value = ServiceStatus.InProgress Then
                If newStatus = ServiceStatus.PendingReview Then
                    'Update Logic
                ElseIf newStatus = ServiceStatus.Completed Then
                    'Update Logic
                End If
            End If

            'Check for rejected work flow. Send email to copywriters (and us if 3 rejection)
            If newStatus = ServiceStatus.Rejected Then
                If oldStatus.Value = ServiceStatus.PendingReview Then

                    'send email
                    SendRejectServieRequestEmail()

                    Dim rejects = From r In request.ServiceRequestHistory Where r.NewStatus = ServiceStatus.Rejected Select r

                    If rejects.Count() >= 3 Then 'Send email to admin
                        'send email
                        SendRejectServieEmailToAdmin()
                    End If
                End If
            End If

        End If

        'Check for new job workflow. Send emails to providers.
        If oldStatus.HasValue = True Then
            If oldStatus.Value = ServiceStatus.UserEditing Then
                    'Get all copywriters
                    For Each p In copywriters
                        'Send email
                    Next
                End If
            End If
        End If

    Catch ex As Exception

    End Try
End Sub

这具有以下优点,

内部逻辑可以轻松改变 整个流程在单一位置进行管理。

可是:

这是顺序的。在for循环中发送电子邮件需要相当长的时间。但是在asp.net发布的时间内,它太大了 我使用SmtpClient作为邮件工具。但是中间层不支持发送异步。

期待解决方案

有没有办法从asp.net发送电子邮件异步,而不是页面(来自中间层)?
基于Web的解决方案还有其他更好的工作流解决方案吗?

我在C#或vb.net中没有我的答案。 我正在使用.net 4.0

其他评论

我需要更新有关此状态的数据库。不仅仅是发送电子邮件。

1 个答案:

答案 0 :(得分:1)

您可以选择解决异步电子邮件问题:

  • 在另一个帖子中启动电子邮件发送部分(例如,uisng ThreadPool.QueueUserWorkItem)并立即返回页面。唯一的问题是,如果出现故障,您无法轻松更新用户。在发送电子邮件之前,可能存在其他问题,例如您的线程被杀死(由于池/ IIS /计算机重新启动)。
  • 创建一个持久队列(将其存储在数据库/文件系统等中)并运行单独的服务/作业来发送电子邮件。这是非常可靠的方式,并且可以在队列位置跟踪成功/尝试/失败,因此将状态更新回用户很简单。
  • 上述选项的变体,您可以使用MSMQ提供的排队。