【问题标题】:Asp.Net Web Based Work FlowAsp.Net 基于 Web 的工作流程
【发布时间】:2011-09-07 12:46:57
【问题描述】:

场景:

我正在开发一个基于 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

补充说明

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

【问题讨论】:

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


【解决方案1】:

您几乎没有办法解决异步电子邮件:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多