ASP.NET MVC在Controller中异步实现的最佳方式

时间:2014-07-27 16:01:13

标签: asp.net-mvc asynchronous asp.net-mvc-5 async-await

我有联系表单,将联系人模型的序列化版本记录到数据库,并发送包含表单数据的电子邮件。在这两个动作之间,最多需要2秒钟才能完成。虽然不是很多时间,但足以惹恼不耐烦的用户。

联络管理员:

public class ContactController : Controller
    {
        // GET: Contact
        public ActionResult Index()
        {
            return View();
        }

        // Post: /Contact/
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Index(Models.ContactModel contact)
        {
            if (ModelState.IsValid)
            {

                XmlSerializer xmlSerializer = new XmlSerializer(contact.GetType());
                using (StringWriter textWriter = new StringWriter())
                {
                    xmlSerializer.Serialize(textWriter, contact);
                    Log.Create("email", textWriter.ToString());
                }

                Smtp.sendMail(sendTo, contact.Email, contact.Name, subject, contact.Comment,
                              ipAddress, senderEmail, contact.Phone, sendBcc);

                // using RedirectToRoute instead of RedirectToAction so that /contact is used.
                return RedirectToRoute("Default", new { action = "contactsucess", controller = "contact" });
            }

            // Return Form if not valid
            return View(contact);
        }

        // GET: /Contact/ContactSucess
        public ActionResult ContactSucess()
        {
            ViewBag.IsContactPage = true;

            return View();
        }
    }

使序列化,日志记录和STMP逻辑与控制器异步的最佳方法是什么,返回成功/感谢页面。基本上我的目标是阻止这些调用阻止整体进度,以便表单更快地完​​成。

1 个答案:

答案 0 :(得分:4)

我的工作经验中的常见解决方案是将电子邮件发送到另一个进程。

Web服务器通过消息总线(如MSMQ,NServiceBus或RabbitMQ)与电子邮件发送者通信。当Web服务器想要发送电子邮件时,它会向发送实际电子邮件的电子邮件发送一条消息。