ASP.Net MVC Отправка электронной почты с обработчиками событий - PullRequest
0 голосов
/ 11 февраля 2019

Я смотрел несколько видео на YT, в которых описывались Event Hanlders с помощью SMS Manager.Я хотел создать что-то похожее на Email Manager:

public class OfferEmailManager
{
        public async void OnSecurityDepositAdded(object source, SecurityDepositEventArgs eventArgs)
        {
            EmailObject email = new EmailObject();
            //preparing email object (subject, body, from, to)
            var result = await EmailAPI.Instance.SendEmail(email);
        }

        private string PrepareSecurityDepositAddMail(SecurityDepositEventArgs eventArgs)
        {
            //preparing mail body
        }
}

Кажется, что все выглядит хорошо, но отправка электронной почты происходит асинхронно, мне пришлось сделать OnSecurityDepositAdded асинхронно.Я хочу отправить электронное письмо, когда SecurityDeposit добавлено в базу данных на контроллере:

public EventHandler<SecurityDepositEventArgs> SecurityDepostAdded;
    protected virtual void OnSecurityDepositAdded(SecurityDeposit securityDeposit, Offer offer)
    {
       SecurityDepositAdded?.Invoke(this, new SecurityDepositEventArgs()
       {
           //values
       });
    }

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> AddSecurityDeposit(SecurityDepositCreateViewModel model)
        {
            Offer offer = db.Offers.Find(model.ID);
            OfferEmailManager manager = new OfferEmailManager();
            SecurityDepositAdded += manager.OnSecurityDepositAdded;
            SecurityDeposit securityDeposit = new SecurityDeposit()
            {
                // values
            };
            db.SecurityDeposits.Add(securityDeposit);
            try
            {
                db.SaveChanges();
                OnSecurityDepositAdded(securityDeposit, offer);
                return RedirectToAction("Details", new { id = model.ID });
            }
            catch (Exception ex)
            {
                ViewBag.ErrorMessage = ex.Message;
                return View(model);
            }
        }

В конце оно идеально подходит к return RedirectToAction, и я получил письмо, но я также получил исключение

Асинхронный модуль или обработчик завершены, пока асинхронная операция еще не завершена

Как я могу обработать это исключение?

...