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

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

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

联系 Controller :

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 逻辑与返回成功/感谢页面的 Controller 异步的最佳方法是什么。基本上我的目标是防止这些调用阻碍整体进度,以便表单更快地完​​成。

最佳答案

根据我的工作经验,常见的解决方案是将电子邮件发送者移至另一个流程。

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

关于asp.net-mvc - ASP.NET MVC 在Controller中异步实现的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982742/

相关文章:

C++ 异步段错误

c# - 如何使用 ValidateInput(false) 装饰 web api 中的操作

scala - Akka:在Actor中一次处理一条消息的原因是什么?

asynchronous - .NET Core Web API 异步数据返回

asp.net - RenderBody 和 RenderSection 之间的区别

c# - 显示由外键引用到 userprofile 表的表中的项目列表

entity-framework - MVC中@Html.DisplayFor()只显示日期

jquery - 如何为日期时间选择器文本框应用样式

c# - 将 URL 片段添加到 MVC ActionLink

jquery - Ajax 向 Controller 操作发送空参数