Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC在控制器中异步实现的最佳方法_Asp.net Mvc_Asynchronous_Asp.net Mvc 5_Async Await - Fatal编程技术网

Asp.net mvc ASP.NET MVC在控制器中异步实现的最佳方法

Asp.net mvc ASP.NET MVC在控制器中异步实现的最佳方法,asp.net-mvc,asynchronous,asp.net-mvc-5,async-await,Asp.net Mvc,Asynchronous,Asp.net Mvc 5,Async Await,我有一个联系人表单,它将联系人模型的序列化版本记录到数据库中,并发送一封包含表单数据的电子邮件。在这两个动作之间,最多需要2秒钟才能完成。虽然时间不多,但这足以让不耐烦的用户恼火 联系人控制器: public class ContactController : Controller { // GET: Contact public ActionResult Index() { return View();

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

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


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

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


web服务器通过消息传递总线(如MSMQ、NServiceBus或RabbitMQ)与emailer通信。当web服务器想要发送电子邮件时,它会向电子邮件发送者发送一条消息,该消息将执行实际的电子邮件发送。

使电子邮件发送代码异步这其中哪一部分比较慢?希望能提高效率。我猜Smtp.SendMail是花费时间的地方,如果是这样,@EhsanSajjad是对的。电子邮件是最慢的部分。我希望围绕调用的逻辑实现一个包装器。使用smtpClient.SendMailAsync方法不会缩短时间。使电子邮件发送代码异步这其中哪一部分比较慢?希望能提高效率。我猜Smtp.SendMail是花费时间的地方,如果是这样,@EhsanSajjad是对的。电子邮件是最慢的部分。我希望围绕调用的逻辑实现一个包装器。使用smtpClient.SendMailAsync方法不会缩短时间。是的-如果可以在Azure上运行,请将Azure Web作业作为实现这些进程外批处理操作的一种方法。在Hanselman的博客上添加一个链接我在想排队,但发送电子邮件似乎有点过头了。这不是过头了,这是应该做的。您可能可以在与web服务器相同的计算机上使用MSMQ和Windows服务。我使用的是Azure网站,因此我将尝试使用队列和Azure WebJob来实现。是的-如果您可以在Azure上运行,请将Azure web Job作为实现这些进程外批处理操作的一种方法。在Hanselman的博客上添加一个链接我在想排队,但发送电子邮件似乎有点过头了。这不是过头了,这是应该做的。您可能可以在与web服务器相同的计算机上使用MSMQ和Windows服务。我使用的是Azure网站,因此我将尝试使用队列和Azure WebJob来实现。