【问题标题】:ASP.NET MVC best way to implement asynchronously in ControllerASP.NET MVC 在 Controller 中异步实现的最佳方式
【发布时间】:2023-03-18 18:13:01
【问题描述】:

我有一个联系人表单,它将联系人模型的序列化版本记录到数据库中,并发送一封包含表单数据的电子邮件。在这两个动作之间,最多需要 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 逻辑与返回成功/感谢页面的控制器异步的最佳方法是什么。基本上我的目标是防止这些调用阻塞整体进度,以便表单完成得更快。

【问题讨论】:

  • 使电子邮件发送代码异步
  • 这部分慢?着眼于提高效率。我猜 Smtp.SendMail 是花费时间的地方,如果是这样,@EhsanSajjad 是对的。
  • 电子邮件是最慢的部分。我希望围绕进行调用的逻辑实现一个包装器。
  • 使用 smtpClient.SendMailAsync 方法不会缩短时间。

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


【解决方案1】:

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

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

【讨论】:

  • 是的 - 如果您可以在 Azure 上运行,请将 Azure Web 作业视为实现这些进程外批处理操作的一种方式。添加指向 Hanselman 博客的链接 hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx
  • 我在想一个队列,但发送电子邮件似乎有点过头了。
  • 这不是矫枉过正,而是应该这样做。您可能可以在与 Web 服务器相同的机器上使用 MSMQ 和 Windows 服务。
  • 我正在使用 Azure 网站,所以我将尝试使用队列和 Azure WebJob 来实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2011-01-12
  • 2010-09-07
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多