У меня есть действие, которое отправляет простое электронное письмо:
[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. Но ответ (в данном случае перенаправление) не отправляется ASP.NET до тех пор, пока client_SendCompleted не будет завершен.
Вот что я пытаюсь понять:
При просмотре выполнения в отладчике Visual Studio функция SendAsync немедленно возвращается (и вызывается RedirectToAction), но в браузере ничего не происходит до тех пор, пока электронная почта не будет отправлена?
Если я поставлю точку останова внутри client_SendCompleted, клиент останется при загрузке .... пока я не нажму F5 в отладчике.