Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
C# 使用Office 365的SmtpClient速度极慢_C#_Asp.net Mvc_Email - Fatal编程技术网

C# 使用Office 365的SmtpClient速度极慢

C# 使用Office 365的SmtpClient速度极慢,c#,asp.net-mvc,email,C#,Asp.net Mvc,Email,我在MVC5网站上工作。本网站包含“联系我们”表单,用户可以在其中联系网站支持 问题在于SendMailAsync至少需要10-13秒才能完成(无附件),并且在该过程运行时,用户被卡住并等待服务器的响应—无论电子邮件是否成功发送 这是我当前的ActionResult方法: [HttpPost] public async Task<ActionResult> Contact(MessageModel Model) { //... await SendMessage(Mo

我在MVC5网站上工作。本网站包含“联系我们”表单,用户可以在其中联系网站支持

问题在于SendMailAsync至少需要10-13秒才能完成(无附件),并且在该过程运行时,用户被卡住并等待服务器的响应—无论电子邮件是否成功发送

这是我当前的ActionResult方法:

[HttpPost]
public async Task<ActionResult> Contact(MessageModel Model)
{
    //...
    await SendMessage(Model);
    //...
    return View();
}
有更快的工作方式吗?我可以这样运行:

await Task.Factory.StartNew(() => SendMessage(Model));

网站不会被“卡住”13秒,响应会是即时的,但是,我也无法向用户提供电子邮件发送是否成功的信息。

我们最近遇到了类似的问题,因为事件注册,每封电子邮件4-5秒,我们需要发送多个不同内容的邮件。客户端的IT人员能够获得一个.protection.outlook.com:25服务器,该服务器接受在同一个域上运行的非ssl通信,耗时1-1.5秒。这足够快,客户端可以通过一些UI显示我们正在处理。我们还尝试了一个本地服务器,它只有大约100毫秒,但他们不想让电子邮件服务在他们的DC上运行


我无法说明此.protection.outlook.com服务器的安装细节,因为我没有参与其中,但如果您不想依赖异步,可能需要进行调查。

原因可能有很多。最好的方法是安装Wireshark并检查发送到SMTP服务器和从SMTP服务器发送的数据包。在邮件服务器响应“已成功排队等待传递”之前,.NET代码将不会继续。发送响应时可以设置人为延迟,这可能值得研究。此外,创建一个新线程来发送电子邮件与后台处理不是一回事。在工作完成之前,操作仍然不会返回。您所做的只是增加开销,这就是为什么在web应用程序中创建新线程通常不被鼓励的原因。是的,如果响应性很重要,我会将其作为一项“点燃并忘记”的任务来完成——您的最后一个代码片段走在正确的轨道上,但如果您等待它,我认为它将无法达到目的。对于通知,您可以实现一个AJAX计时器,定期检查服务器,查看是否有要显示的更新,然后向用户显示一条消息-我还没有做过大量此类工作,但也有这样的教程:对于火灾和遗忘的情况,您可以删除最后一行代码中的
wait
关键字:只需调用
Client.SendMailAsync(Message)。是的,通过这种方式,您将不会收到成功消息,但您实现的内容无论如何都不允许失败。为了测试起见,由于不清楚花费时间的原因(可能是调用的服务),您可以将最后一行代码更改为
wait Client.SendMailAsync(message).configurewait(false)。这可能会更快,如果有什么东西阻止您的本地线程。
await Task.Factory.StartNew(() => SendMessage(Model));