gpt4 book ai didi

asp.net-mvc-3 - SmtpClient.SendAsync 阻塞了我的 ASP.NET MVC 请求

转载 作者:行者123 更新时间:2023-12-04 17:23:46 27 4
gpt4 key购买 nike

我有一个发送简单电子邮件的操作:

    [HttpPost, ActionName("Index")]
public ActionResult IndexPost(ContactForm contactForm)
{
if (ModelState.IsValid)
{
new EmailService().SendAsync(contactForm.Email, contactForm.Name, contactForm.Subject, contactForm.Body, true);

return RedirectToAction(MVC.Contact.Success());
}
return View(contactForm);
}

和电子邮件服务:
    public void SendAsync(string fromEmail, string fromName, string subject, string body, bool isBodyHtml)
{
MailMessage mailMessage....
....
SmtpClient client = new SmtpClient(settingRepository.SmtpAddress, settingRepository.SmtpPort);

client.EnableSsl = settingRepository.SmtpSsl;
client.Credentials = new NetworkCredential(settingRepository.SmtpUserName, settingRepository.SmtpPassword);
client.SendCompleted += client_SendCompleted;
client.SendAsync(mailMessage, Tuple.Create(client, mailMessage));
}

private void client_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
Tuple<SmtpClient, MailMessage> data = (Tuple<SmtpClient, MailMessage>)e.UserState;
data.Item1.Dispose();
data.Item2.Dispose();

if (e.Error != null)
{

}
}

当我发送电子邮件时,我使用的是 Async 方法,然后我的方法 SendAsync 立即返回,然后调用 RedirectToAction。但是在 client_SendCompleted 完成之前,ASP.NET 不会发送响应(在这种情况下是重定向)。

这是我试图理解的内容:

在 Visual Studio 调试器中观看执行时,SendAsync 立即返回(并调用 RedirectToAction),但在发送电子邮件之前浏览器中没有任何 react ?

如果我在 client_SendCompleted 中放置一个断点,则客户端将保持加载...直到我在调试器中按 F5。

最佳答案

这是设计使然。 ASP.NET 如果异步工作以调用底层 的方式开始,则将自动等待任何未完成的异步工作完成,然后再完成请求。同步上下文 .这是为了确保如果您的异步操作尝试与 交互。 HttpContext , HttpResponse 等等,它仍然会存在。

如果你想做真正的火与忘记,你需要把你的电话包裹在ThreadPool.QueueUserWorkItem .这将强制它在一个新的线程池线程上运行而不通过 同步上下文 ,所以请求会很高兴地返回。

但是请注意,如果由于任何原因应用程序域在您的发送仍在进行中关闭(例如,如果您更改了 web.config 文件、将新文件放入 bin、应用程序池回收等)您的异步发送会突然中断。如果你关心这个,看看 Phil Haacks WebBackgrounder ASP.NET ,这让您可以排队并运行后台工作(例如发送电子邮件),以确保在应用程序域关闭的情况下正常完成。

关于asp.net-mvc-3 - SmtpClient.SendAsync 阻塞了我的 ASP.NET MVC 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com