Asp.Net веб-рабочий процесс - PullRequest
0 голосов
/ 03 июня 2011

Сценарий:

Я занимаюсь разработкой веб-приложения.В моем приложении пользователи запрашивают услугу написания статьи у копирайтеров.Затем копирайтеры приступят к созданию и отправят статью обратно клиенту.Затем клиент может одобрить или отклонить статьи.Все эти действия имеют статус.

Бизнес-проблема:

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, кроме страницы (со среднего уровня)?Есть ли какой-либо другой лучший подход к рабочему процессу для веб-решения?

У меня нет ответов на C # или vb.net.Я использую .net 4.0

Дополнительные комментарии

Мне нужно обновить базу данных относительно этого статуса.Не только отправка писем.

1 Ответ

1 голос
/ 03 июня 2011

У вас есть несколько вариантов для решения асинхронной рассылки:

  • Запустите отправляющую электронную почту часть в другом потоке (например, uisng ThreadPool.QueueUserWorkItem ) и немедленно верните страницу. Единственная проблема заключается в том, что в случае сбоев вы не можете легко обновить пользователя обратно. Могут быть и другие проблемы, такие как уничтожение ваших потоков (из-за перезапуска пула / IIS / машины) перед отправкой электронной почты.
  • Создайте постоянную очередь (сохраните ее в базе данных / файловой системе и т. Д.) И запустите отдельную службу / задание для отправки электронных писем. Это очень надежный способ, и успех / попытки / неудачи могут отслеживаться в местоположении очереди, поэтому обновление статуса обратно пользователю просто.
  • Вариант вышеупомянутых опций, где вы используете очереди, предоставляемые MSMQ.
...